【问题标题】:python multiprocessing - what is wrong?python多处理 - 怎么了?
【发布时间】: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


【解决方案1】:

pool.apply_async(func, args=(val,))val通过pickle/unpickle发送到子进程,因此它是子进程中的不同对象,尽管它们具有相同的值。子进程的状态变化不会影响父进程,因为它们有独立的内存空间。

【讨论】:

    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    相关资源
    最近更新 更多