【问题标题】:multiprocessing - child process constantly sending back results and keeps running多处理 - 子进程不断发回结果并继续运行
【发布时间】:2018-02-12 15:55:51
【问题描述】:

是否有可能让一些子进程运行一些计算,然后将结果发送到主进程(例如更新 PyQt ui),但这些进程仍在运行,一段时间后它们会发回数据并再次更新 ui? 使用 multiprocessing.queue,似乎数据只能在进程终止后发回。 所以我想知道这种情况是否可能。

【问题讨论】:

    标签: python pyqt queue multiprocessing communication


    【解决方案1】:

    我不知道您所说的“使用 multiprocessing.queue,似乎数据只能在进程终止后才能发回”。这正是 Multiprocessing.Queue 设计的用例。

    PyMOTW 是大量 Python 模块(包括多处理)的绝佳资源。在这里查看:https://pymotw.com/2/multiprocessing/communication.html

    一个如何使用多处理和循环从子级向父级发送持续消息的简单示例:

    import multiprocessing
    
    def child_process(q):
        for i in range(10):
            q.put(i)
        q.put("done")  # tell the parent process we've finished
    
    def parent_process():
        q = multiprocessing.Queue()
        child = multiprocessing.Process(target=child_process, args=(q,))
        child.start()
        while True:
            value = q.get()
            if value == "done":  # no more values from child process
                break
            print value
            # do other stuff, child will continue to run in separate process
    

    【讨论】:

    • 我不确定我是否理解。您的意思是,如果需要超过一定时间才能完成,您想终止该过程吗?如果这是您想要的,那么您可能应该查看信号包中的 signal.alarm docs.python.org/2/library/signal.html
    • 谢谢!所以我想知道如果我想从子进程中获得一些结果而不等待它终止的情况。子进程一直在运行并不断发回数据。这可能吗?
    • 是的,您只需在每次生成新值时调用 queue.put 的循环中运行您的子进程。然后父线程可以运行一个不同的循环,每次调用 queue.get。
    • 啊。我现在知道你的意思了。我想我完全错过了队列的使用。我会重读你分享的文章。非常感谢!
    • 非常感谢您提供的示例。对我理解 Queue 真的很有帮助。干杯!
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2018-07-13
    • 2021-01-27
    • 2019-08-05
    • 1970-01-01
    相关资源
    最近更新 更多