【问题标题】:What's the simplest way to implement fire-and-forget parallel threads in Python?在 Python 中实现即发即弃并行线程的最简单方法是什么?
【发布时间】:2015-07-07 10:19:03
【问题描述】:

我有一个带有 tkinter GUI (Python 2.7) 的程序,用户可以从中启动一些或多或少的计算密集型任务。大多数结果要么是写入磁盘的文件,要么是一个显示结果的交互式 pyplot 窗口,但它们都没有反馈到主任务中。

我以前从未做过多线程,我正在尝试决定使用哪个库。 subprocess 似乎是用于系统调用(这不是),multiprocessing 似乎与并行执行更大的任务(使用池和队列等)有关,而 threading ......我已经看过了官方文档,但有点不清楚我将如何使用它。

对我来说,理想的解决方案是“简单”地表达触发计算和绘制一些数据的函数调用,使其独立于主程序执行,这样用户就可以继续做他们的事情而无需等待函数完成(通常需要几秒钟到一分钟)——情节最终会弹出。

更新 结果我想并行启动的任务包含绑定方法,因此不可提取并且不能并行使用。在我有时间弄清楚如何改变它之前,我需要处理其他一些事情——不过,我会回到这个问题上!

【问题讨论】:

    标签: python multithreading


    【解决方案1】:

    多处理库可能是您最好的选择,只需创建一个进程并启动它。来自手册:https://docs.python.org/2/library/multiprocessing.html

    from multiprocessing import Process
    
    def f(name):
        print 'hello', name
    
    if __name__ == '__main__':
        p = Process(target=f, args=('bob',))
        p.start()
    

    退出时你可能确实想等待结果,所以添加join() 方法:

    p.join()
    

    或者,如果您只是想稍等片刻:

    p.join(timeout=1)
    

    【讨论】:

    • 我收到一条关于 Pickle 无法处理任务中涉及的对象之一的错误消息...我想 multiprocessing 正在使用 Pickle 创建所涉及对象的“副本”子进程?
    • @Zak:基本上,是的。多处理库在一个单独的进程中执行所有内容,并将所有内容作为腌制对象传递。如果这是一个问题,您可以改用线程,但在这种情况下,所有内容都将使用相同的 CPU 内核执行,因此可能会减慢您的主进程。
    • 关于pickle in multiprocessing: stackoverflow.com/q/27318290
    【解决方案2】:

    想知道这是否会有所帮助。这是我用来在 Python 中执行线程的简单模式

    from threading import Thread
    
    class Operation(Thread):
        def __init__(self):
            """Initialize"""
        def run(self):
            """Implement the run method. This will get executed when you 
               instantiate and call the start method"""
    
    def main():
        """ main program"""
        mythread = Operation()
        mythread.start()
        ...
        mythread.join()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 2023-03-20
      • 2018-02-09
      • 1970-01-01
      相关资源
      最近更新 更多