生产者消费者模型执行问题
from multiprocessing import Process,Queueimport time,random
def producer(q,name,food):
for i in range(5):
time.sleep(random.uniform(0.2,0.5))
print('%s produce a %s%s' %(name,food,i))
q.put(food+str(i))
def consumer(q,name):
while True:
food = q.get()
if food == None:
break
time.sleep(random.uniform(0.2,0.5))
print('%s gets a %s' %(name,food))
if __name__ == '__main__':
q = Queue()
p1 = Process(target = producer,args=(q,'Dean','Orange'))
p1.start()
c1 = Process(target = consumer,args=(q,'Amanda'))
c1.start()
p1.join()
q.put(None)
上面的代码为什么我在pycharm里面可以正常运行,在python IDLE里面运行一点反应都没有呢?
回答:
不是没有反应,是因为idle没有把子进程的stdout重定向过来,你要重定向一下才能看到输出
def producer(q,name,food): sys.stdout = open("xx.log",'a')
#......
def consumer(q,name):
sys.stdout = open("xx.log", 'a')
#....
回答:
idle的标准输入和输出问题同 @huisexiaochou 讨论了那么多,发现我有臆测错误的地方,看官方说明
https://docs.python.org/zh-cn...
By default, IDLE runs user code in a separate OS process rather than in the user interface process that runs the shell and editor. In the execution process, it replaces sys.stdin, sys.stdout, and sys.stderr with objects that get input from and send output to the Shell window. The original values stored in sys.__stdin__, sys.__stdout__, and sys.__stderr__ are not touched, but may be Non
这段话还有我很多需要探究的地方。简单而言,标准输入输出在在IDLE的这个特殊的OS process进程中,被魔改了
以上是 生产者消费者模型执行问题 的全部内容, 来源链接: utcz.com/a/157279.html