我对Twisted线程感到困惑。
我听过并阅读了不少文章,书籍,并通过一些关于Python中线程与进程主题的演示文稿进行了讨论。在我看来,除非一个人正在做大量的IO或想要跨作业使用共享内存,否则正确的选择是使用多处理。
然而,从我到目前为止所看到的,似乎Twisted使用Threads(来自python线程模块的pThreads)。 Twisted似乎在处理大量数据方面表现得非常出色。
我有相当多的进程,我想在单个节点/服务器上使用Python中的MapReduce模式分发处理。他们真的不做任何IO,他们只是做了很多处理。
Twisted反应器是否适合这项工作?
答案 0 :(得分:6)
对您的问题的简短回答:没有,扭曲的线程不是重处理的正确解决方案。
如果你有很多处理要做,扭曲的线程仍将受GIL(全局解释器锁)的约束。在没有深入解释的情况下,GIL一次只允许一个线程执行python代码。实际上这意味着您将无法利用单个多线程扭曲过程来利用多个内核。也就是说,一些 C模块(比如SciPy的部分)可以释放GIL并运行多线程,尽管相关的python代码仍然是有效的单线程。
使用它和阻塞基于I / O的模块主要有用的是什么twisted的线程。一个主要的例子是数据库API,因为db-api规范没有考虑异步用例,并且大多数数据库模块都遵守规范。因此,要使用PostgreSQL,例如来自扭曲的应用程序,必须阻止或使用像twisted.enterprise.adbapi
这样的包装器,它使用twisted.internet.threads.deferToThread
允许SQL查询执行而其他内容正在进行。这可以允许运行其他python代码,因为socket
模块(在大多数其他涉及操作系统I / O的模块中)将在系统调用中释放GIL。
也就是说,您可以使用twisted来编写网络应用程序,与许多扭曲的(或非扭曲的,如果您愿意的话)工作人员交谈。然后,每个工作人员都可以完成一些工作,并且不会受到GIL的限制,因为每个工作人员都是自己完全孤立的进程。然后,主进程可以使用许多twisted的异步原语。例如,您可以使用DeferredList
等待来自任意数量的工作程序的大量结果,然后在所有Deferred
完成后运行响应处理程序。 (因此允许你进行地图调用)如果你想沿着这条路走下去,我建议你查看twisted.protocols.amp
,这是他们的异步消息协议,可以非常简单地用来实现基于网络的RPC或地图,减少
与multiprocessing
之类的东西相比,运行许多不同进程的缺点是
虽然对于现代系统,2)很少是一个问题,除非你运行数百个子过程。问题1)可以通过使用像supervisord
这样的流程管理系统来解决修改有关python和GIL的更多信息,您应该观看Dave Beazley关于主题的讨论(website,video,{{3} })
答案 1 :(得分:0)
您还可以使用python 2.6及更高版本进行多处理 http://docs.python.org/library/multiprocessing.html
这是使用扭曲多处理的一个很好的例子。 Twisted network client with multiprocessing workers?