Twisted 文档让我相信,在同一个应用程序中结合 和 等技术是可以reactor.spawnProcess()
的threads.deferToThread()
,reactor 可以在幕后优雅地处理这个问题。在实际尝试后,我发现我的应用程序死锁了。自己使用多个线程,或者自己使用子进程,一切都很好。
查看反应器源代码,我发现该SelectReactor.spawnProcess()
方法只是简单地调用os.fork()
,而不考虑可能正在运行的多个线程。这解释了死锁,因为从对您的调用开始,os.fork()
将有两个进程运行多个并发线程,并且谁知道使用相同的文件描述符做什么。
我的问题是,解决这个问题的最佳策略是什么?
我想到的是 subclass SelectReactor
,所以它是一个单例并且os.fork()
只调用一次,在实例化时立即调用。子进程将在后台运行并充当父进程的服务器(使用管道上的对象序列化来来回通信)。父进程继续运行应用程序并且可以根据需要使用线程。在父进程中的调用spawnProcess()
将委托给子进程,这将保证只有一个线程在运行,因此可以os.fork()
安全地调用。
有没有人这样做过?有更快的方法吗?