命名两个列表 A、B
我想从 A 列表中删除 B 列表元素。
未使用多处理的 Python 代码
A = ["leo", "kiki", "eden"]
B = ["eden", "kiki"]
for i in B:
A.remove(i)
我想到的多处理代码如下。
from multiprocessing import Pool
import time
A = ["leo", "kiki", "eden"]
B = ["eden", "kiki"]
def test(i):
global A
A.remove(i)
print("intest : ",A)
if __name__ == '__main__':
global A
pool = Pool(processes=2)
pool.map(test ,B)
pool.close()
pool.join()
print("final : ",A)
输出结果:
intest : ['leo', 'kiki']
intest : ['leo']
final : ['leo', 'kiki', 'eden']
为什么在“intest”中全局变量正确应用。
在“final”中,全局变量更改不适用?
请给我很多帮助。
答案 0 :(得分:0)
进程间不共享全局变量。当你创建一个新进程时,它是一个不同的 python 实例被启动。它们不能共享价值,它们只是在创建时被复制。您对子进程所做的任何调整只会对该进程可见,而不是启动它们的原始 Python 进程。
要解决此问题,您可以使用多处理模块中的 managers
。您可以创建一个 manager.list()
以允许在进程之间共享值。以下示例删除了全局参数并使用了 Manager
类:
import time
from multiprocessing import Pool
from multiprocessing import Manager
def test(test_list,i):
test_list.remove(i)
print("intest : ", test_list)
if __name__ == '__main__':
with Manager() as manager:
A = manager.list(["leo", "kiki", "eden"])
B = ["eden", "kiki"]
print("Start : ", A)
pool = Pool(processes=2)
pool.starmap(test, [(A, K) for K in B])
pool.close()
pool.join()
print("Final : ", A)
答案 1 :(得分:0)
多线程时使用 global
共享内存就足够了。在多进程上共享内存必须以不同的方式实现,这是因为不同的进程处理变量和对象的不同“副本”。进程间共享内存可以通过使用多处理模块的 SharedMemory
类来实现,该类还提供了创建类列表对象的能力,这些对象可以通过使用 ShareableList
类在进程之间共享。所以你应该这样转换你的代码:
from multiprocessing import shared_memory
A = shared_memory.ShareableList(["leo", "kiki", "eden"])
# you must always close and unlink shared_memory
A.shm.close()
A.shm.unlink()
您可以在官方 python 文档中阅读更多相关信息: https://docs.python.org/3/library/multiprocessing.shared_memory.html