1
我想熟悉multiprocessing
模塊。我目前在Pipe()
有一些問題。我設計了一個小例子來說明我的問題。多處理管道()不工作
我寫了兩個功能:
- 檢測這些文件並將它們複製到另一個文件夾(
cleaner
)
之一,在一個特定的文件夾(spawner
)
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()
我似乎沒有能夠得到它的工作..任何幫助,將不勝感激。
非常感謝答案。它確實有效,或多或少。你是否介意張貼'Pipe()'解決方案,並假設我想傳遞文件名? –
在這種情況下,你將在spawner中有'pipeEnd.send(new_file)'(可能在完成時發送'None'或'False')。在清理程序中,您將擁有'filename = pipeEnd.recv()',然後執行一些簡單的文本處理來生成新名稱(在dest目錄中)和'copy2(filename,dest_filename)' – lxop
明白了。我用'queue'完成了這個工作(''用'spawner'將隊列中的文件放入隊列中''用'clean'將它們'取代',直到'queue'爲空。)非常感謝! –