代码之家  ›  专栏  ›  技术社区  ›  Tuure Laurinolli

更简单的python并发构建块?

  •  2
  • Tuure Laurinolli  · 技术社区  · 16 年前

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

    5 回复  |  直到 10 年前
        1
  •  5
  •   Michael Sparks    16 年前

    正如前面提到的,Kamaelia旨在使并发性在Python中更容易使用。

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

    从那时起,生活开始了,它被广泛应用于各种各样的问题领域,从桌面系统(如白板应用程序、数据库建模、教孩子读写的工具)到网站后端系统(如用于转码和转换用户贡献的图像和视频的东西,用于网络Playba)。在各种场景和短信息/短信应用程序中。

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

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

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

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

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

    首先,Kamaelia的核心(Axon)是为了使我的日常工作更容易,并以可重用的方式总结最佳实践(消息传递、软件事务性内存)。我希望这也能让你的生活更轻松些。

        2
  •  5
  •   Alex Martelli    16 年前

    虽然这可能不是很明显, 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
    

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

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

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

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

        3
  •  3
  •   Hank Gay    16 年前

    Python(至少cpython)和Java的并发性非常不同,至少部分是因为全局解释器锁(吉尔)。通常,Python中的并发性不是通过线程实现的,而是通过进程实现的。见 multiprocessing 对于“标准”并发模块。

    另外,退房 "A Curious Course on Coroutines and Concurrency" 对于一些来自Java的新的并发技术。DavidBeazley(作者)是一个聪明人,当涉及到Python时,尤其是并发性。

        4
  •  3
  •   mmmmmm    16 年前

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

        5
  •  0
  •   Anfernee    10 年前

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