单个节点/服务器上的Twisted Threading + MapReduce?

时间:2011-02-15 17:33:34

标签: python multithreading twisted mapreduce

我对Twisted线程感到困惑。

我听过并阅读了不少文章,书籍,并通过一些关于Python中线程与进程主题的演示文稿进行了讨论。在我看来,除非一个人正在做大量的IO或想要跨作业使用共享内存,否则正确的选择是使用多处理。

然而,从我到目前为止所看到的,似乎Twisted使用Threads(来自python线程模块的pThreads)。 Twisted似乎在处理大量数据方面表现得非常出色。

我有相当多的进程,我想在单个节点/服务器上使用Python中的MapReduce模式分发处理。他们真的不做任何IO,他们只是做了很多处理。

Twisted反应器是否适合这项工作?

2 个答案:

答案 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之类的东西相比,运行许多不同进程的缺点是

  1. 你失去了简单的流程管理,
  2. 子进程无法共享内存,就像它们在unix系统上分叉一样。
  3. 虽然对于现代系统,2)很少是一个问题,除非你运行数百个子过程。问题1)可以通过使用像supervisord

    这样的流程管理系统来解决

    修改有关python和GIL的更多信息,您应该观看Dave Beazley关于主题的讨论(websitevideo,{{3} })

答案 1 :(得分:0)

您还可以使用python 2.6及更高版本进行多处理 http://docs.python.org/library/multiprocessing.html

这是使用扭曲多处理的一个很好的例子。 Twisted network client with multiprocessing workers?