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)
两个都不工作,有人可以帮助我吗?谢谢一堆^ _ ^
答案 0 :(得分:0)
def main():
multiprocessing.Process(target=af).run() # will not return
multiprocessing.Process(target=bf).run()
上述代码不起作用,因为af
没有返回;没有机会致电bf
。您需要将run
调用start
/ join
分开,以便两者可以并行运行。 (+让他们分享manage.Queue
)
要使第二个代码有效,您需要将a
(manager.Queue
对象)传递给函数。否则,他们将使用在进程之间不共享的Queue.Queue
全局对象;需要修改af
,bf
以接受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))
我知道这是一个老问题,但希望它有所帮助!