在Azure Service Fabric actor中启动一个线程?

时间:2018-03-09 17:20:36

标签: multithreading azure azure-service-fabric actor

我知道Service Fabric中的actor是单线程的。但是假设我在actor方法中启动一个新线程,那么会发生什么?即使生成的线程仍在执行,是否会停用actor?

根据documentation,演员在没有被使用时被停用'一段时间'使用'在这种情况下意味着:

  • 接听电话
  • IRemindable.ReceiveReminderAsync被调用

所以似乎我开始的新线程没有被考虑在内。但也许有人可以证实这一点?

2 个答案:

答案 0 :(得分:2)

演员只是对象。

Actor将为deactivated,它可用于垃圾回收。

操作系统中的实际线程(运行时)保持running直到它们完成或终止。可以收集他们的托管表示,但这不会影响实际的线程。

此外,不会以任何方式跟踪在Actor内部生成的线程,因此您自己负责管理其生命周期。

答案 1 :(得分:1)

完全。

当你启动一个新线程时,原始线程(actor)将继续运行并超出范围,并且跨越线程继续运行。看看会发生什么:

当一个actor接收一个调用时,处理这个调用的线程将使用SemaphoreSlim获取一个锁以处理actor对象,如果另一个线程已经获得了该锁,则当前线程将等待它的释放,这样它就可以了继续一次免费。

获取锁后,线程将执行并从被调用的方法返回,并释放锁以继续跟随线程。

当您作为actor逻辑的一部分跨越一个新线程时,它将作为服务进程的一部分运行,但问题是,一旦您离开方法范围,您将无法再控制此线程,但它会继续运行,并且对于任务已完成的actor运行时,下一个actor调用将创建另一个线程,并且事情将继续进行。

问题将在以下时间开始:

  • 您无法控制正在运行的线程数,您的服务将开始消耗太多内存,SF可能会尝试跨实例平衡actors \ _服务,因为它不知道这些线程,如果它移动了actor服务,所有线程都将被中止,你就会失去这些操作。
  • 上次调用的跨区线程将与新线程竞争下一个actor调用。
  • 如果新线程使用actor数据继续其他操作,则跨区线程和actor线程将面临并发问题,如果没有异常发生,您将有一些奇怪的行为,您无法轻松调查。例如,一个线程更改另一个使用的值。
  • 您可能面临的许多其他并发问题

在您可能(想)需要另一个线程的情况下:

  • 创建另一个actor来处理任务
  • 在队列中创建要由其他服务处理的消息
  • 将此任务作为演员调用的一部分。