1 回答

TA貢獻1871條經(jīng)驗 獲得超13個贊
同步是您的示例中缺少的一點。manager.list只是一個list單獨的服務(wù)器進程中的正常情況,您的工作進程可以通過代理對象進行修改。您的進一步流程恰好同時檢查len(my_array)。
沒有同步,這告訴他們應(yīng)該等到另一個進程完成它的操作,包括執(zhí)行此長度檢查并根據(jù)此檢查的結(jié)果執(zhí)行操作。您的更新操作不是原子操作,您需要通過在您的操作周圍使用 manager.lock 來實現(xiàn)它。
您的代碼中還有另一個問題,您重新綁定my_array以指向普通 list ['y'],而不是更新/修改 shared manager.list。你是不是修改manager.list與設(shè)置過程my_array = ['y']中,manager.list保持它的價值['a', 'b', 'c', 'x']通過第一個工作流程,直到程序結(jié)束,從第一個修改。
from multiprocessing import Process, Manager
def f(my_array, lock):
with lock:
if len(my_array) < 4:
my_array.append('x')
else:
my_array[:] = [] # clear list inplace by assigning
# empty list to slice of manager.list
my_array.append('y')
print(my_array)
if __name__ == '__main__':
N_WORKERS = 5
with Manager() as manager:
my_array = manager.list(['a', 'b', 'c'])
lock = manager.Lock()
pool = [
Process(target=f, args=(my_array, lock)) for _ in range(N_WORKERS)
]
for p in pool:
p.start()
for p in pool:
p.join()
# Leaving the context-manager block will shut down the manager-process.
# We need to convert the manager-list to a normal list in the parent
# to keep its values available for further processing in the parent.
result = list(my_array)
print(f'result: {result}')
示例輸出:
['a', 'b', 'c', 'x']
['y']
['y', 'x']
['y', 'x', 'x']
['y', 'x', 'x', 'x']
result: ['y', 'x', 'x', 'x']
Process finished with exit code 0
添加回答
舉報