python - 多处理 Pipe() 不起作用

标签 python python-3.x multiprocessing pipe

我正在尝试熟悉多处理模块。我目前在 Pipe() 方面遇到一些问题。我设计了一个小例子来说明我的问题。

我写了两个函数:

  • 在特定文件夹 (spawner) 中创建文件
  • 另一个检测这些文件并将它们复制到另一个文件夹(cleaner)

它们都工作得很好。我还设法为两者创建一个Process,以便文件的创建和复制同时发生。

对于下一步,我希望 spawnercleaner 通信,它已完成创建文件,以便后者可以终止。

这是代码:

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 是解决您问题的错误方法。如果您想将文件名从生成器传递到清理器,您可以使用管道,但您要做的是升起一个标志。为此,我建议使用Event:https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Event

这可以被认为是线程安全(和多进程安全) bool 值。你会像这样使用它

finished = mp.Event()
...
finished.set()  # pipeEnd.send(True)
...
while not finished.is_set():  # while not receiver.recv():

关于python - 多处理 Pipe() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46037496/

相关文章:

python - save() 收到意外的关键字参数

python - 类型错误 : string indices must be integers error when parsing Json with Python

python - 如何使用 map 多处理 Pandas 数据框?

python 执行器从完成回调生成任务(递归提交任务)

python - 使用 OpenCV 和 Python 多处理进行持续相机抓取

python - Scapy - 如何剖析以太网拖车字段

python - 用漂亮的汤解析数据表

python-3.x - 结束 ='' 语法错误 : invalid syntax

python - Django/haystack - 仅基于 DateField 的年份元素进行分面

python - 使用 sqlalchemy 语句和表达式 api 生成多个连接