这是我的代码:
airflow
如果我在上部范围内运行(没有包含在import pandas as pd
import multiprocessing as mp
CPU = 4
inp = pd.DataFrame({ 'col': ['a', 'b'] })
def test(dataframe):
df = dataframe.copy()
def worker(data):
print('worker')
def callback(data):
print('callback')
pool = mp.Pool(CPU)
for idx, row in df.iterrows():
print((idx, row['col']))
pool.apply_async(worker, args=[(idx, row['col'])], callback=callback)
pool.close()
pool.join()
return df
test(inp)
函数中),但是在将其封闭在另一个函数中之后,它可以正常工作 - 它们就不会被调用。
以下是我通过test
函数收到的输出:
test
不
(0, 'a')
(1, 'b')
所以问题是 - 如何让它在另一个函数中运行?
答案 0 :(得分:1)
来自multiprocessing
模块文档:
安全导入主模块
确保新的Python解释器可以安全地导入主模块,而不会导致意外的副作用(例如 开始一个新的过程。)
注意此程序包中的功能要求子项可以导入
__main__
模块。这包括在内 Programming guidelines但是值得指出这一点。
正确的方法之一如下:
import pandas as pd
import multiprocessing as mp
CPU = 4
inp = pd.DataFrame({'col': ['a', 'b']})
def worker(data):
print(data)
print('worker')
def callback(data):
print('callback')
def test(dataframe):
df = dataframe.copy()
with mp.Pool(CPU) as pool:
for idx, row in df.iterrows():
result = pool.apply_async(worker, args=[(idx, row['col'])], callback=callback)
result.wait()
return df
if __name__ == '__main__':
test(inp)
输出:
(0, 'a')
worker
(1, 'b')
worker
callback
callback