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