Tuu*_*lli 2 python concurrency multithreading
似乎Python标准库缺少各种有用的并发相关概念,例如原子计数器,执行器和其他可以在例如java.util.concurrent中找到的概念.是否有任何外部库可以为并发Python应用程序提供更简单的构建块?
虽然可能不会立即明显,itertools.count 是确实的原子计数器(在仅上的一个实例的操作x体,拼写next(x),相当于一个"原子++x",如果C具有这样的概念;-). 编辑:至少,这肯定存在于CPython中; 我认为它是Python标准定义的一部分,但显然IronPython和Jython不同意(不确保count.next在当前实现中的线程安全性)所以我可能错了!
也就是说,假设您目前拥有一个数据结构,例如:
counters = dict.fromkeys(words_of_interest, 0)
...
if w in counters: counters[w] += 1
Run Code Online (Sandbox Code Playgroud)
而你的问题是后一个增量不是原子的,所以如果两个线程同时处理相同的感兴趣的词,那么两个增量可能会干扰(只有一个会"干",所以计数器只增加一个,而不是两个).然后:
counters = dict((w, itertools.count()) for w in words_of_interest)
...
if w in counters: next(counters[w])
Run Code Online (Sandbox Code Playgroud)
将以原子方式执行相同的操作.
(遗憾的是,没有明显的,记录的方法来"提取计数器的当前值",尽管实际上str(x)确实返回了一个字符串,例如'count(3)'可以从中再次解析当前值;-).
正如已经提到的,Kamaelia的目标是使python中的并发更容易使用.
它最初的用例是网络系统(它自然是并发的),并以"我们如何才能使这些系统更容易开发和维护"为观点进行开发.
从那时起生活就开始了,它被用于桌面系统中更广泛的问题领域(如白板应用,数据库建模,教孩子读写工具)到网站后端系统(如转码和转换用户提供的图像和视频,以便在各种场景和短信/短信应用程序中进行网络播放.
核心概念与Unix管道基本相同 - 除了代替可以有python生成器,线程或进程的进程 - 这些被称为组件.这些通过收件箱和发件箱进行通信 - 每个人都喜欢,而不仅仅是stdin/stdout/stderr.此外,您不需要序列化的文件接口,而是在组件之间传递完全成熟的python对象.而且不仅限于管道,您可以使用任意形状 - 称为图形线.
您可以在此处找到完整的教程(视频,幻灯片,可下载的PDF小册子):
或者这里的5分钟版本(O'Reilly点燃谈话):
对图书馆的关注是务实的发展,系统的安全性和易维护性,尽管最近在添加一些语法糖方面付出了一些努力.像任何开发人员(我和其他人:-)欢迎有关改进它的反馈.
您还可以在此处找到更多信息: - http://www.slideshare.net/kamaelian
首先,Kamaelia的核心(Axon)是为了让我的日常工作更轻松,并以可重复使用的方式结束最佳实践(消息传递,软件事务存储器)而编写的.我希望它也让你的生活更轻松:-)
| 归档时间: |
|
| 查看次数: |
1589 次 |
| 最近记录: |