【问题标题】:Python multiprocessing - apply_async not workingPython 多处理 - apply_async 不起作用
【发布时间】:2019-04-05 11:47:10
【问题描述】:

我正在尝试使用 ThreadPool 并行化代码。我目前正在研究窗户。基本上,我得到的行为是当我调用 apply_async 时没有任何反应。我的程序只打印 START 和 END。

下面有一个例子:

import glob
import itertools
import pandas as pd
from multiprocessing.dummy import Pool as ThreadPool 


def ppp(window,day):
    print(window,day)


#%% Reading datasets
print('START')
tree = pd.read_csv('datan\\days.csv')
days = list(tree.columns)
windows = [2000]
processes_args = list(itertools.product(windows, days))


pool = ThreadPool(8) 
results = pool.apply_async(ppp, processes_args)
pool.close() 
pool.join() 
print('END')

堆栈上有很多问题建议调用其他方法,例如 imap_unordered、map、apply。但是,它们都没有解决问题。

编辑:

results.get()

返回关于参数数量的错误:

TypeError: ppp() takes 2 positional arguments but 10 were given

但是,文档说明我可以使用元组列表来传递参数,否则我该如何传递它们?

编辑2:

processes_args 在调用 apply_async 之前看起来像下面的输出:

[(2000, '0808'),
 (2000, '0810'),
 (2000, '0812'),
 (2000, '0813'),
 (2000, '0814'),
 (2000, '0817'),
 (2000, '0818'),
 (2000, '0827'),
 (2000, '0828'),
 (2000, '0829')]

【问题讨论】:

  • 您想检查AsyncResult 结果以获取任何可见的错误。只需致电results.get()
  • 我编辑了这个问题,谢谢。 @noxdafox

标签: python multithreading multiprocessing threadpool


【解决方案1】:

Pool.applyPool.apply_async 中的位置参数使用* unpacking syntax 展开。

根据processed_args 的内容,您的ppp 函数在通过apply_async 调度时将收到10 个元组。

如果你想处理一个迭代,我建议你使用Pool.mapPool.map_asyncmap 函数不会扩展可迭代对象中的参数。你需要自己照顾它。

def ppp(element):
    window, day = element
    print(window, day)

pool.map(ppp, processed_args)

如果您想保持 ppp 函数不变,您可以使用 Pool.starmap,它将参数扩展应用于迭代器内容。

【讨论】:

  • 好点,我现在主要使用concurrent.futurespebble。我忘记了multiprocessing.Pool 方法。将更新答案。
猜你喜欢
  • 2016-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 2014-11-13
  • 2013-02-20
  • 1970-01-01
相关资源
最近更新 更多