Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python更容易的并发构建块?_Python_Multithreading_Concurrency - Fatal编程技术网

Python更容易的并发构建块?

Python更容易的并发构建块?,python,multithreading,concurrency,Python,Multithreading,Concurrency,Python标准库似乎缺少各种有用的并发相关概念,如原子计数器、执行器和其他可以在java.util.concurrent中找到的概念。是否有任何外部库可以为并发Python应用程序提供更简单的构建块?Python(至少是CPython)和Java中的并发性有很大的不同,至少部分原因是全局解释器锁(GIL)。通常,Python中的并发不是通过线程实现的,而是通过进程实现的。有关“标准”并发模块,请参阅 另外,请查看一些对我来说非常新的来自Java的并发技术。大卫·比兹利(作者)是个聪明人™ 当涉

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

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


另外,请查看一些对我来说非常新的来自Java的并发技术。大卫·比兹利(作者)是个聪明人™ 当涉及到Python,尤其是并发性时。

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

虽然它可能不是很明显,实际上是一个原子计数器(仅对其实例
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
您的问题是后一个增量不是原子的,因此如果两个线程同时处理同一个感兴趣的字,那么这两个增量可能会相互干扰(只有一个会“take”,因此计数器只会增加一个,而不是两个)。然后:

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


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

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

它最初的用例是网络系统(这是一个自然并发的系统),开发时的观点是“我们如何使这些系统更易于开发和维护”

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

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

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

或者这里的5分钟版本(O'Reilly ignite talk):

该库的重点是实用性开发、系统安全性和易维护性,尽管最近在添加一些语法方面做了一些努力。与其他任何事情一样,开发人员(我和其他人:-)欢迎对其进行改进的反馈

您还可以在此处找到更多信息: -


Kamaelia的core(Axon)主要是为了让我的日常工作更轻松,并以可重用的方式总结最佳实践(消息传递、软件事务性内存)。我希望它也能让你的生活更轻松:-)

创造一个“工作人员”python多处理库上的抽象。它通过启动具有特定技能/属性(定义的函数)的“工作人员”,并提供一个接收“作业”的队列,简化了多处理的并发性它有点类似于线程池,只包含进程而不是线程。因此它更适合于大量CPU指令。您还可以使用它生成单个应用程序的多个实例,甚至生成“worker”有多个线程。

关于STM顺便说一句-请参阅本页了解如何使用简化的STM-的详细信息。如果您熟悉版本控制,即使短语/名称可能是,STM也不应该是怪异和可怕的。但是,这个原子性不只是CPython的一个实现细节以及GIL和C代码协同工作的方式吗?
d=defaultdict(itertools.count)\n对于w,用词来说是感兴趣的:next(d[w])
@J.F.Sebastian,您的变体本质上并不是“原子的”(在线程安全性方面,向dict添加一个键(包括通过defaultdict隐式添加),这可能会导致重新格式化,而严格使用现有键,这是我的代码所做的)@Tuure,我刚刚浏览了IronPython和Jython的资料,他们似乎同意你的解释——这听起来很奇怪,但我想我可能错了——让我编辑一下,补充一点!
  counters = dict((w, itertools.count()) for w in words_of_interest)
  ...
  if w in counters: next(counters[w])