【问题标题】:Is there an equivalent to perl's Forks::Super in python?python中是否有与perl的Forks::Super等价的东西?
【发布时间】:2021-06-05 19:42:35
【问题描述】:

我有一个函数,我必须运行大约 1000 次。每次运行大约需要 8-15 秒,有时甚至更长。为了节省时间,我想并行化它。但并非所有 2000 次都同时运行,而是例如每时每刻运行 50 个函数。因此,有必要使用某种总体管理器来跟踪并行函数运行的数量,并确保每个时刻都有 50 个处于活动状态,并且一旦函数运行完成,它就应该启动一个新功能运行再次达到 50。我曾经在 perl 中使用 Forks::Super 模块做同样的事情。是否有与 python 中可用的等效项?

【问题讨论】:

  • 工具和库推荐请求在这里绝对是题外话(请参阅stackoverflow.com/help/on-topic 列表中的#4),但有趣的是你使用了一个标准库模块的标签,它具有 正是这个功能。注意多处理池。
  • 你不能利用标准库池抽象吗?
  • 你们都指的是包多处理,不是吗?我事先做了一些阅读,偶然发现了这个包,但我的印象是它并没有提供我想要的东西。老实说,我不是程序员,我只是偶尔写脚本,而且这些东西真的很复杂,至少对我来说是这样。
  • 您能否在问题中添加更多详细信息
  • @zweiund40,如果你不相信multiprocessing.Pool 能做你想做的事,写一个minimal reproducible example 来证明它实际做的和你需要做的之间的区别。跨度>

标签: python python-multiprocessing python-multithreading


【解决方案1】:

谢谢你们。你帮了我很多。我的最小可重现示例运行良好!

from multiprocessing import Pool
import time
import random
import string

def id_generator(size=8, chars=string.ascii_uppercase + string.digits):
     return ''.join(random.choice(chars) for _ in range(size))

def f(x):
    sleep = random.randint(8,15)
    time.sleep(sleep)
    return x + ": " + str(sleep) + "s"

if __name__ == '__main__':
    l = []
    for i in range(42): l.append(id_generator())
    start = time.time()
    with Pool(processes=8) as p:
        print(p.map(f, l))
    print('All in all: {a:6.2f}s'.format(a=time.time()-start))


【讨论】:

  • 当然,我复制了大部分内容并对其进行了一些改动。
猜你喜欢
  • 2011-11-16
  • 2011-09-25
  • 2022-01-10
  • 2018-05-26
  • 2014-10-14
  • 2012-12-30
  • 2020-07-21
  • 1970-01-01
  • 2021-09-17
相关资源
最近更新 更多