【问题标题】:Multiprocessing with threading?多线程处理?
【发布时间】:2017-07-16 14:50:30
【问题描述】:

当我试图让我的脚本多线程时,

我发现了多处理,

我想知道是否有办法让多处理与线程一起工作?

  • cpu 1 -> 3 个线程(worker A,B,C)
  • cpu 2 -> 3 个线程(worker D,E,F)
  • ...

我想自己做,但遇到了很多问题。

有没有办法让这两者一起工作?

【问题讨论】:

    标签: python python-3.x web-crawler


    【解决方案1】:

    您可以生成多个Processes,然后从其中生成Threads。每个进程几乎可以处理标准解释器线程可以处理的任何事情,因此没有什么能阻止您在每个进程中创建新线程甚至新进程。举个小例子:

    def foo():
        print("Thread Executing!")
    
    def bar():
        threads = []
        for _ in range(3): # each Process creates a number of new Threads
            thread = threading.Thread(target=foo) 
            threads.append(thread)
            thread.start()
        for thread in threads:
            thread.join()
    
    if __name__ == "__main__": 
        processes = []
        for _ in range(3):
            p = multiprocessing.Process(target=bar) # create a new Process
            p.start()
            processes.append(p)
        for process in processes:
            process.join()
    

    线程之间的通信可以在每个Process 中处理,进程之间的通信可以使用队列或管理器对象在根解释器级别处理。

    【讨论】:

    • 这段代码对我帮助很大!,如果我在这段代码中添加Queue,我应该锁定处理还是线程?我假设如果我锁定进程,我会停止 3 个线程,对吗?
    • @atth3burger91 这取决于你想要做什么。根据documentation,“队列是线程和进程安全的”,因此您不必担心同时添加到队列中。但是,如果您关心按特定顺序添加和检索,您应该添加一个锁,或者为您传递给队列的对象添加标识符。 Manager dicts 也可以更容易使用,尽管它们不那么轻量级。
    • 请注意,我原来的例子是草率的,因为 print 不是线程安全的。每个打印语句都应该有一个lock.acquirelock.release 语句,以防止同时写入输出流。
    • 使用队列时进程没有退出,程序完成后如何关闭进程。
    • 您确定在开始后立即调用 join 吗?我想你开始然后加入他们?
    【解决方案2】:

    您可以定义一个function,它采用process 并使其运行3 个threads,然后生成您的进程来定位此function,例如:

    def threader(process):
        for _ in range(3):
            threading.Thread(target=yourfunc).start()
    
    def main():
        # spawn whatever processes here to target threader
    

    【讨论】:

      猜你喜欢
      • 2017-04-12
      • 1970-01-01
      • 2012-03-17
      • 2011-09-17
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多