【发布时间】:2023-03-21 22:52:01
【问题描述】:
我需要上传文件到服务器,时间太长(很多小文件)。我尝试了多进程,但由于某种原因它似乎不起作用。当通过池调用时,“结果”不会改变。如果我只在一个对象上调用该函数,它会改变结果。 如果我执行 print(self)-with removed (def repr) 我可以看到该进程正在处理不同的对象(副本?)我该如何解决这个问题?
import time
from builtins import range, enumerate, str
from multiprocessing import Pool
class UploadJob():
def __init__(self, value):
self.value = value
self.result = None
def run(self):
print("start",self.value)
time.sleep(1)#simulate uploading
print("end",self.value)
self.result = str(self.value) + "_fromServer" #save some ID for file
def __repr__(self):
return str(self.value)+"-"+str(self.result)
job = UploadJob(99)
print(job)
job.run()
print(job)
print()
arr = [x for x in range(0,5)]
for idx,val in enumerate(arr):
arr[idx] = UploadJob(val)
print(arr)
def func(val:UploadJob):
val.run()
pool = Pool()
for val in arr:
res = pool.apply_async(func, args=(val,))
pool.close()
pool.join()
print(arr)
输出:
99-None
start 99
end 99
99-99_fromServer
[0-None, 1-None, 2-None, 3-None, 4-None]
start 0
start 1
start 2
start 3
start 4
end 0
end 1
end 2
end 3
end 4
[0-None, 1-None, 2-None, 3-None, 4-None]
编辑: 如果我更改 func 以返回值,并使用 pool.map 它正常工作,则原始数组不会更改但副本是正确的。如果 UploadJob 会有一个文件作为 bytearray 进程会复制它吗?
def func(val:UploadJob):
val.run()
return val
with Pool() as pool:
arr1 = pool.map(func, arr)
print(arr)#prints the original result with None
print(arr1)#prints the correct values
【问题讨论】:
-
结果没有改变,因为进程不共享内存。这意味着,对于您创建的每个流程,都有一个新的“结果”变量。
标签: python multiprocessing pool