在 Azure Service Fabric 参与者中启动一个线程?
Start a thread inside an Azure Service Fabric actor?
我知道 Service Fabric 中的参与者是单线程的。但是假设我在 actor 方法中启动一个新线程,那么会发生什么?即使生成的线程仍在执行,actor 也会被停用吗?
根据 documentation,当某个 actor 一段时间未被 'used' 时,该 actor 将被停用。 'Used' 在这种情况下意味着:
- 接到电话
IRemindable.ReceiveReminderAsync
正在调用
看来我新开的线程没有考虑进去。但也许有人可以证实这一点?
演员只是客体。
Actor 将 deactivated 并且可用于垃圾回收。
OS 中的实际线程(当 运行 时)保持 running 直到它们完成或终止。可以收集它们的托管表示,但这不会影响实际线程。
此外,不会以任何方式跟踪 Actor 内部生成的线程,因此您有责任自行管理它们的生命周期。
完全正确。
当您启动一个新线程时,原始线程(参与者)将继续 运行ning 并超出范围,而跨区线程将继续 运行ning。看看接下来会发生什么:
当一个actor接到一个调用时,处理这个调用的线程会使用SemaphoreSlim获取一个锁来处理actor对象,如果另一个线程已经获取了锁,当前线程会等待它的释放,这样免费后可以继续。
一旦获得锁,线程将执行并return从被调用的方法中释放锁以供后续线程继续。
当你将一个新线程作为 actor 逻辑的一部分时,它只是 运行 作为服务进程的一部分,但这里的问题是一旦你离开方法范围,你就不会不再控制此线程,但它会保持 运行ning,并且在 actor 运行 任务完成时,下一个 actor 调用将创建另一个线程,事情将继续进行。
问题将在以下时间出现:
- 您无法控制 运行 有多少线程,您的服务将开始消耗过多内存,并且 SF 可能会尝试平衡 actors\services 跨实例,因为它不知道关于这些线程,如果它移动了 actor 服务,你所有的线程都将被中止,你将失去这些操作。
- 上次调用的跨线程将与新线程竞争下一次 actor 调用。
- 如果新线程使用actor数据继续其他操作,跨线程和actor线程将面临并发问题,在没有异常发生的情况下,您将有奇怪的行为,您无法轻易调查。例如,一个线程更改另一个正在使用的值。
- 以及您可能面临的许多其他并发问题
在您可能(认为)需要另一个线程的情况下,您可以:
- 创建另一个 actor 来处理任务
- 在队列中创建消息以供其他服务处理
- 作为演员调用的一部分执行任务。
我知道 Service Fabric 中的参与者是单线程的。但是假设我在 actor 方法中启动一个新线程,那么会发生什么?即使生成的线程仍在执行,actor 也会被停用吗?
根据 documentation,当某个 actor 一段时间未被 'used' 时,该 actor 将被停用。 'Used' 在这种情况下意味着:
- 接到电话
IRemindable.ReceiveReminderAsync
正在调用
看来我新开的线程没有考虑进去。但也许有人可以证实这一点?
演员只是客体。
Actor 将 deactivated 并且可用于垃圾回收。
OS 中的实际线程(当 运行 时)保持 running 直到它们完成或终止。可以收集它们的托管表示,但这不会影响实际线程。
此外,不会以任何方式跟踪 Actor 内部生成的线程,因此您有责任自行管理它们的生命周期。
完全正确。
当您启动一个新线程时,原始线程(参与者)将继续 运行ning 并超出范围,而跨区线程将继续 运行ning。看看接下来会发生什么:
当一个actor接到一个调用时,处理这个调用的线程会使用SemaphoreSlim获取一个锁来处理actor对象,如果另一个线程已经获取了锁,当前线程会等待它的释放,这样免费后可以继续。
一旦获得锁,线程将执行并return从被调用的方法中释放锁以供后续线程继续。
当你将一个新线程作为 actor 逻辑的一部分时,它只是 运行 作为服务进程的一部分,但这里的问题是一旦你离开方法范围,你就不会不再控制此线程,但它会保持 运行ning,并且在 actor 运行 任务完成时,下一个 actor 调用将创建另一个线程,事情将继续进行。
问题将在以下时间出现:
- 您无法控制 运行 有多少线程,您的服务将开始消耗过多内存,并且 SF 可能会尝试平衡 actors\services 跨实例,因为它不知道关于这些线程,如果它移动了 actor 服务,你所有的线程都将被中止,你将失去这些操作。
- 上次调用的跨线程将与新线程竞争下一次 actor 调用。
- 如果新线程使用actor数据继续其他操作,跨线程和actor线程将面临并发问题,在没有异常发生的情况下,您将有奇怪的行为,您无法轻易调查。例如,一个线程更改另一个正在使用的值。
- 以及您可能面临的许多其他并发问题
在您可能(认为)需要另一个线程的情况下,您可以:
- 创建另一个 actor 来处理任务
- 在队列中创建消息以供其他服务处理
- 作为演员调用的一部分执行任务。