【发布时间】:2021-06-24 12:01:26
【问题描述】:
我是多处理的菜鸟,我正在尝试加快我的旧算法。它工作得非常好,没有多重处理,但在我尝试实现它的那一刻,程序停止工作:它一直待命,直到我中止脚本。 另一个问题是它没有填充数据框:同样,它通常可以工作,但是使用多处理它只返回 NaN。
func 运行良好。
stockUniverse = list(map(lambda s: s.strip(), Stocks)) #Stocks = list
def func(i):
df.at[i, 'A'] = 1
df.at[i, 'B'] = 2
df.at[i, 'C'] = 3
print(i, 'downloaded')
return True
if __name__ == "__main__":
print('Start')
pool = mp.Pool(mp.cpu_count())
pool.imap(func, stockUniverse)
print(df)
结果是:
Index 19 NaN NaN NaN
index 20 NaN NaN NaN
然后它就停在那里,直到我点击Ctrl+C。
谢谢
【问题讨论】:
-
你必须向我们展示
stockUniverse的代码 -
我编辑了代码,谢谢
-
和
d.func的代码 - 对不起 -
imap返回一个迭代器。您必须迭代迭代器以确保stockUniverse中的所有隐含任务都已提交、执行并返回结果。您的第二个问题是池中的每个进程都有自己的地址空间,并且没有更新主进程中的df实例。 -
@Aaron 感谢您的回复。是的,
imap通常最终会提交任务,但只有在有机会的情况下。我的意思是,在 OP 发布的代码中,有对imap和print的调用,然后程序终止,因此任务将没有机会在程序结束时开始(当然也不会按时间调用print函数)。可以在调用print之前插入对time.sleep的调用,猜测任务开始和完成需要多长时间,但我认为我们同意“迭代迭代器”确实是要走的路。