Multithreading scala参与者与线程和阻塞IO

Multithreading scala参与者与线程和阻塞IO,multithreading,scala,concurrency,actor,Multithreading,Scala,Concurrency,Actor,据我所知,actor基本上是在线程之上实现的轻量级线程,在一个小的共享线程池中运行许多actor 在这种情况下,在actor中使用阻塞操作会阻塞底层线程。这不是一个正确性问题,因为actor库会根据需要生成更多的线程(是吗?),但最终会产生大量的线程,从而否定了使用actor的好处 鉴于此,当您需要执行此类IO操作时,参与者如何工作?是否存在“actor block”的操作,在让线程继续执行其他操作时挂起actor(就像在让CPU继续执行其他操作时挂起线程的阻塞操作一样),或者所有内容都是用CP

据我所知,actor基本上是在线程之上实现的轻量级线程,在一个小的共享线程池中运行许多actor

在这种情况下,在actor中使用阻塞操作会阻塞底层线程。这不是一个正确性问题,因为actor库会根据需要生成更多的线程(是吗?),但最终会产生大量的线程,从而否定了使用actor的好处

鉴于此,当您需要执行此类IO操作时,参与者如何工作?是否存在“actor block”的操作,在让线程继续执行其他操作时挂起actor(就像在让CPU继续执行其他操作时挂起线程的阻塞操作一样),或者所有内容都是用CPS编写的,并且有链接的actor?还是演员根本不适合这种长期运作


背景:我有以经典方式编写多线程内容的经验,对CPS/event循环的工作方式非常了解,但绝对没有与参与者合作的经验,我只想从更高的层次上理解它们是如何适应的,在我深入研究代码之前。

erlang中的工作原理是所有阻塞操作都应该由send message执行,因为当您的参与者被阻塞等待消息时,它会将线程交给其他参与者

所以,若你们想做一些阻塞操作,比如从文件中读取,你们应该做一个FileReader参与者,它使用非阻塞api从文件中读取和写入。并让您的其他参与者使用此参与者(向其发送和接收消息)作为api来读取和写入文件

这不是一个正确性问题,因为actor库将根据需要生成更多线程(是这样吗?)

据我所知,那是不对的。参与者被阻止,向其发送另一条消息会导致该消息位于参与者邮箱中,直到该参与者可以
接收它或
对该消息作出反应

在Scala(1)中的编程中,它明确指出参与者不应该阻塞。如果一个参与者需要做一些长时间运行的事情,那么它应该将工作传递给另一个参与者,以便主要参与者可以释放自己,并从其邮箱中读取更多消息。一旦工人完成了工作,它就可以将这一事实反馈给主角,主角可以完成它必须做的任何事情

由于工作人员也有邮箱,因此最终会有几个工作人员忙于完成工作。如果你没有足够的CPU来处理这个问题,他们的队列就会越来越大。最终,您可以通过使用远程参与者进行扩展。在这种情况下可能更有用

(1) Scala编程第32.5章(Odersky,第二版,2010年)

编辑:我发现这个:

可以重写Actor trait的scheduler方法以返回resizeblethreadpoolscheduler,该方法调整其线程池的大小,以避免调用任意阻塞方法的Actor造成的饥饿

在以下网址找到:


因此,这意味着根据您设置的调度器impl,用于运行actors的池可能会增加。当我说你错了时,我错了:-)答案的其余部分仍然是正确的。

它应该在某个点上包含分隔的延续,如中所示。或者使用非阻塞消息流?请看我的答案