【问题标题】:Run all iterations in a for loop in parallel并行运行 for 循环中的所有迭代
【发布时间】:2015-06-29 07:21:14
【问题描述】:

我正在使用 Python v 2.2.1 并尝试编写需要在 for 循环内并行执行某些任务的代码。迭代次数不固定,取决于列表(在本例中为serverList)。我如何通过多线程或多处理来实现这一点。我通读了一些示例,但它们并行调用了不同的函数。在这里,我需要调用相同的函数 (shutdownTask),但参数不同。部分代码如下:

try:
    <some code>
    for server in serverList:
        print ('Shutting down server: '+server+'...')
        shutdownTask(server, serverType)
finally:
    verifyStatus()

【问题讨论】:

  • 你试过Pykka吗?
  • Python v 2.2.1?真的吗?因为那是古老的。
  • 您使用 13 年前的 python 版本有什么原因吗?
  • 查看 print 函数(及其括号),您可能指的是 Python v 3.2.1。虽然我仍然建议升级到当前版本(3.4)。
  • introduction on Pythons multiprocessing 给出了一个非常简单的例子,用不同的参数并行调用相同的函数。您可以根据自己的需要进行调整。

标签: python multithreading for-loop multiprocessing python-2.2


【解决方案1】:

我推荐你Celery。您可以在后台为每台服务器启动一项任务。

要创建任务,请使用 @task 装饰器装饰函数。

要运行任务,您可以使用添加到修饰任务函数的delay() 方法。

注意:我不知道如果你真的使用非常旧的 Python 版本 2.2.1 是否会出现兼容性问题

更新

如果您不需要这么复杂的解决方案,那么您可以使用Thread 类。

【讨论】:

  • 既然内置的多处理模块可以做到这一点,为什么还要安装整个 Celery 框架?
  • 如果你正在创建一个相当大的系统,Celery 是一个不错的选择。您可以监控任务的状态并以非常简单的方式管理它们。但是,如果这是一项简单的任务并且您不需要任何管理,则可以通过threading
  • 我在问题中没有看到任何大型系统的迹象,所以我会从小处着手。
【解决方案2】:

您可以使用进程(或线程)池(假设您指的是 Python 3.2 版本):

from multiprocessing import Pool

def shutdown(server):
    try:
        shutdownTask(server, serverType)
    except Exception as e:
        return server, str(e)
    else:
        return server, None

try:
    <some code>
    pool = Pool()
    for server, error in pool.imap_unordered(shutdown, serverList):
        if error is None:
            print('Done shutting down server:', server, '...')
        else:
            print('Error shutting down server:', server, '...', error)
finally:
    verifyStatus()

【讨论】:

  • multiprocessing 是“2.6 版中的新功能”。
  • @PeterWood:Python 3.2
  • @PeterWood:阅读问题下的 cmets。 2.2很可能是一个错误。甚至不清楚如何安装如此古老的版本
  • 问题下的cmets验证是2.2.1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 2020-07-30
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
相关资源
最近更新 更多