我知道 Service Fabric 中的参与者是单线程的。但是假设我在 actor 方法中启动了一个新线程,那么会发生什么?即使生成的线程仍在执行,actor 会被停用吗?
根据文档,一个actor在一段时间没有被“使用”时会被停用。在这种情况下,“使用”意味着:
IRemindable.ReceiveReminderAsync
被调用所以似乎没有考虑到我启动的新线程。但也许有人可以证实这一点?
确切地。
当您启动一个新线程时,原始线程(演员)将继续运行并超出范围,而跨区线程将继续运行。看看会发生什么:
当一个actor收到一个调用时,处理这个调用的线程会使用一个SemaphoreSlim来获取一个锁来处理这个actor对象,如果另一个线程已经获取了这个锁,当前线程会等待它的释放,这样一旦空闲它就可以继续.
一旦获得锁,线程将执行并从调用的方法返回,并释放锁以供后续线程继续。
当你跨越一个新线程作为actor逻辑的一部分时,它只会作为服务进程的一部分运行,但这里的问题是,一旦你离开方法范围,你将不再控制这个线程,但它将继续运行,并且对于角色运行时任务已经完成,下一个角色调用将创建另一个线程,并且事情将继续进行。
问题将在以下情况下开始:
在您可能(认为)需要另一个线程的情况下,您可以:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句