Python的并发构建块更容易?

时间:2009-10-30 16:34:16

标签: python multithreading concurrency

似乎Python标准库缺少各种有用的并发相关概念,例如原子计数器,执行器和其他可以在例如java.util.concurrent中。是否有任何外部库可以为并发Python应用程序提供更简单的构建块?

5 个答案:

答案 0 :(得分:5)

虽然可能不是很明显,但itertools.count 确实是一个原子计数器(其实例x上的唯一操作,拼写如果C具有这样的概念,next(x)等同于“原子++x ;-)。 编辑:至少,这肯定在CPython中有效;我认为它是Python标准定义的一部分,但显然IronPython和Jython不同意(不能确保当前实现中count.next的线程安全性)所以我可能错了!

也就是说,假设您目前拥有数据结构,例如:

  counters = dict.fromkeys(words_of_interest, 0)
  ...
  if w in counters: counters[w] += 1

并且你的问题是后一个增量不是原子的,所以如果两个线程同时处理相同的感兴趣的词,那么两个增量可能会干扰(只有一个会“接受”,所以计数器会增加只有一个,而不是两个)。然后:

  counters = dict((w, itertools.count()) for w in words_of_interest)
  ...
  if w in counters: next(counters[w])

将以原子方式执行相同的操作。

(遗憾的是,没有明显的,记录的方法来“提取计数器的当前值”,但实际上str(x)确实返回了一个字符串,例如'count(3)',可以从中解析当前值再次出来; - )。

答案 1 :(得分:5)

Kamaelia,如前所述,旨在使python中的并发更容易使用。

其最初的用例是网络系统(自然并发),并以“我们如何才能使这些系统更易于开发和维护”的观点开发。

从那时起,生活就开始了,它被用于桌面系统中更广泛的问题领域(如白板应用程序,数据库建模,教孩子读写工具)到网站后端系统(喜欢转码和转换用户提供的图像和视频,以便在各种场景和短信/短信应用中进行网络播放。

核心概念与Unix管道基本相同 - 除了可以拥有python生成器,线程或进程的进程 - 这些被称为组件。这些通过收件箱和发件箱进行通信 - 每个人都喜欢,而不仅仅是stdin / stdout / stderr。此外,您不需要序列化的文件接口,而是在组件之间传递完全成熟的python对象。而且不仅限于管道,您可以使用任意形状 - 称为图形线。

您可以在此处找到完整的教程(视频,幻灯片,可下载的PDF小册子):

或者这里的5分钟版本(O'Reilly点燃谈话):

对图书馆的关注是务实的发展,系统的安全性和易维护性,尽管最近在添加一些语法糖方面付出了一些努力。像任何开发人员(我和其他人:-)欢迎有关改进它的反馈。

您还可以在此处找到更多信息:    - http://www.slideshare.net/kamaelian

首先,Kamaelia的核心(Axon)是为了让我的日常工作更轻松,并以可重复使用的方式结束最佳实践(消息传递,软件事务存储器)。我希望它也能让你的生活更轻松: - )

答案 2 :(得分:3)

Python中的并发(至少是CPython)和Java完全不同,至少部分是因为全局解释器锁(GIL)。通常,Python中的并发性不是通过线程实现的,而是通过进程实现的。有关“标准”并发模块,请参阅multiprocessing

另外,请查看"A Curious Course on Coroutines and Concurrency"以了解一些来自Java的新技术。 David Beazley(作者)是一个Smart Guy™,一般来说是Python,特别是并发。

答案 3 :(得分:3)

kamaelia提供了将并发抽象到线程或进程等的工具。

答案 4 :(得分:0)

P-workers创建了一个" Job-Worker" python多处理库的抽象。它通过启动" Workers"来简化多处理的并发性。具有特定技能/属性(定义的功能),并提供他们接收的队列"工作"从。它有点类似于线程池,只有进程而不是线程。因此它更适合于大量的CPU指令。您还可以使用它来生成单个应用程序的多个实例,甚至可以生成" Workers"有多个线程。