报错内容
Traceback (most recent call last):
File "em1.py", line 244, in <module>
pool.apply_async(LogExceptions(data_write),(multi_rows,model,preprocess,device,))
File "/root/miniconda3/envs/torch/lib/python3.7/multiprocessing/pool.py", line 362, in apply_async
raise ValueError("Pool not running")
ValueError: Pool not running
报错代码
for path in path_list:
# pool.restart()
rows=[]
print('reading...',path)
with open(path,'r',encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
rows = [row for row in reader]
print('len',len(rows))
step = 2000
cnt = int(len(rows) / step) + 1
print('总进程个数',cnt)
for i in range(cnt):
multi_rows = rows[i*step:(i+1)*step]
# data_write(multi_rows,model,preprocess,device)
pool.apply_async(LogExceptions(data_write),(multi_rows,model,preprocess,device,))
pool.close()
pool.join()
报错原因
pool.close() pool.join() 写在for循环里面,第一次for结束后,多进场池子就关闭了,所以第二次for无法打开池子
注意这里的for是多进程的for(代码中第二个for),我这段代码有两个for,第一个for是读文件,跟这个问题无关,这里可以忽视,主要是第二个for。
解决方法一(亲测有效)
把 pool.close() pool.join() 写到for外面,所有for结束后再关闭,如下:
for path in path_list:
# pool.restart()
rows=[]
print('reading...',path)
with open(path,'r',encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
rows = [row for row in reader]
print('len',len(rows))
step = 2000
cnt = int(len(rows) / step) + 1
print('总进程个数',cnt)
for i in range(cnt):
multi_rows = rows[i*step:(i+1)*step]
# data_write(multi_rows,model,preprocess,device)
pool.apply_async(LogExceptions(data_write),(multi_rows,model,preprocess,device,))
pool.close()
pool.join()
解决方法二(没试过,也有用,不过第一个方法就够了)
加一个try except, 在except里面运行跟try一样的代码,不过在开始的时候多加一行:pool.restart()