具有无限循环和队列的基本多处理

时间:2016-11-12 06:21:58

标签: python multiprocessing

import random
import queue as Queue
import _thread as Thread

a = Queue.Queue()

def af():
    while True:
        a.put(random.randint(0,1000))

def bf():
    while True:
        if (not a.empty()): print (a.get())

def main():
    Thread.start_new_thread(af, ())
    Thread.start_new_thread(bf, ())
    return

if __name__ == "__main__":
    main()

以上代码在极高的CPU使用率下运行良好,我试图使用多处理无济于事。我试过了

def main():
    multiprocessing.Process(target=af).run()
    multiprocessing.Process(target=bf).run()

def main():
    manager = multiprocessing.Manager()
    a = manager.Queue()
    pool = multiprocessing.Pool()
    pool.apply_async(af)
    pool.apply_async(bf)
两个都不工作,有人可以帮助我吗?谢谢一堆^ _ ^

3 个答案:

答案 0 :(得分:0)

def main():
    multiprocessing.Process(target=af).run()  # will not return
    multiprocessing.Process(target=bf).run()

上述代码不起作用,因为af没有返回;没有机会致电bf。您需要将run调用start / join分开,以便两者可以并行运行。 (+让他们分享manage.Queue

要使第二个代码有效,您需要将amanager.Queue对象)传递给函数。否则,他们将使用在进程之间不共享的Queue.Queue全局对象;需要修改afbf以接受a,并main传递a

def af(a):
    while True:
        a.put(random.randint(0, 1000))

def bf(a):
    while True:
        print(a.get())
def main():
    manager = multiprocessing.Manager()
    a = manager.Queue()
    pool = multiprocessing.Pool()
    proc1 = pool.apply_async(af, [a])
    proc2 = pool.apply_async(bf, [a])

    # Wait until process ends. Uncomment following line if there's no waiting code.
    # proc1.get()
    # proc2.get()

答案 1 :(得分:0)

在第一个备选main中,您使用的是Process,但您应该调用以启动活动的方法是 run(),正如人们所想的那样,而是start()。您需要使用适当的join()语句进行跟进。根据{{​​1}}中的信息(此处提供:https://docs.python.org/2/library/multiprocessing.html),以下是一份工作示例:

multiprocessing

答案 2 :(得分:0)

要添加到 accepted answer,在原始代码中:

while True:
    if not q.empty():
        print (q.get())

q.empty() 每次都被调用,这是不必要的,因为 q.get() 如果队列为空将等到有可用的东西 here documentation

类似答案here

我认为这可能会影响性能,因为每次迭代调用 .empty() 应该消耗更多资源(如果使用 Thread 而不是 Process 应该更明显,因为 Python Global Interpreter Lock (GIL))

我知道这是一个老问题,但希望它有所帮助!