【问题标题】:Twisted Threading + MapReduce on a single node/server?单个节点/服务器上的 Twisted Threading + MapReduce?
【发布时间】:2011-02-15 17:33:34
【问题描述】:

我对 Twisted 线程感到困惑。

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

然而,就我目前所见,Twisted 似乎使用线程(来自 python 线程模块的 pThreads)。 Twisted 在处理大量数据方面似乎表现得非常好。

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

Twisted reactor 是否适合这项工作?

【问题讨论】:

    标签: python multithreading twisted mapreduce


    【解决方案1】:

    对您的问题的简短回答:,绞线不是重型加工的正确解决方案。

    如果你有很多处理要做,twisted 的线程仍然会受到 GIL(全局解释器锁)的约束。在不深入解释的情况下,GIL 是一次只允许一个线程执行 python 代码的东西。这实际上意味着您将无法通过单个多线程扭曲进程利用多个内核。也就是说,一些 C 模块(例如 SciPy 的一些部分)可以释放 GIL 并运行多线程,尽管相关的 python 代码仍然是有效的单线程。

    twisted 的线程主要用于将它与基于阻塞 I/O 的模块一起使用。一个典型的例子是数据库 API,因为 db-api 规范不考虑异步用例,并且大多数数据库模块都遵循规范。因此,例如要从一个扭曲的应用程序中使用 PostgreSQL,必须阻止或使用类似 twisted.enterprise.adbapi 的东西,这是一个使用 twisted.internet.threads.deferToThread 的包装器,以允许在其他事情发生时执行 SQL 查询。这可以允许其他 python 代码运行,因为socket 模块(以及大多数涉及操作系统 I/O 的模块)将在系统调用时释放 GIL。


    也就是说,您可以使用twisted 编写一个network 应用程序,与许多twisted(或非twisted,如果您愿意的话)工人交谈。然后,每个工作人员都可以从事少量工作,您将不受受到 GIL 的限制,因为每个工作人员都是自己完全隔离的进程。然后主进程可以使用许多扭曲的异步原语。例如,您可以使用DeferredList 等待来自任意数量的工作人员的大量结果,然后在所有Deferred 完成时运行响应处理程序。 (因此允许您进行地图调用)如果您想沿着这条路线走,我建议查看twisted.protocols.amp,这是他们的异步消息协议,可以非常简单地用于实现基于网络的 RPC 或 map-减少。

    multiprocessing 相比,运行许多不同的进程的缺点是

    1. 您会失去简单的流程管理,并且
    2. 子进程无法像在 unix 系统上分叉一样共享内存。

    尽管对于现代系统,2) 很少成为问题,除非您正在运行数百个子进程。而问题1)可以通过使用像supervisord这样的流程管理系统来解决


    编辑有关python和GIL的更多信息,您应该观看Dave Beazley关于该主题的演讲(websitevideoslides

    【讨论】:

    • 您可以使用像安瓿这样的模块来为您做流程管理。也不清楚 Python 进程从 fork() 派生的 COW 页面中受益多少,因为 CPython 几乎连续地写入页面(以更新引用计数)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    相关资源
    最近更新 更多