我正在尝试熟悉multiprocessing
模块。我目前在使用Pipe()
时遇到了一些问题。我设计了一个小例子来说明我的问题。
我写了两个函数:
spawner
)cleaner
)他们都很好。我还设法为两者创建Process
,以便同时创建和复制文件。
对于下一步,我希望spawner
与cleaner
通信已完成创建文件,以便后者可以终止。
以下是代码:
import os
from time import sleep
import multiprocessing as mp
from shutil import copy2
def spawner(f_folder, pipeEnd):
template = 'my_file{}.txt'
for i in range(10):
new_file = os.path.join(f_folder, template.format(str(i)))
with open(new_file, 'w'):
pass
sleep(1)
pipeEnd.send(True)
return
def cleaner(f_folder, t_folder, pipeEnd):
state = set()
while not pipeEnd.recv():
new_files = set(os.listdir(f_folder)).difference(state)
state = set(os.listdir(f_folder))
for file in new_files:
copy2(os.path.join(f_folder, file), t_folder)
sleep(3)
return
if __name__ == '__main__':
receiver, sender = mp.Pipe()
from_folder = r'C:\Users\evkouni\Desktop\TEMP\PythonTests\subProcess\from'
to_folder = r'C:\Users\evkouni\Desktop\TEMP\PythonTests\subProcess\to'
p = mp.Process(target=spawner, args=(from_folder, sender))
q = mp.Process(target=cleaner, args=(from_folder, to_folder, receiver))
p.start()
q.start()
我似乎无法让它工作..任何帮助都将不胜感激。
答案 0 :(得分:2)
Pipe
是您问题的错误解决方案。如果要将文件名从spawner传递给清理器,可以使用管道,但是您要做的是引发一个标志。为此,我建议使用Event
:https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Event
这可以被认为是线程安全的(和多进程安全的)布尔值。你会像
一样使用它finished = mp.Event()
...
finished.set() # pipeEnd.send(True)
...
while not finished.is_set(): # while not receiver.recv():