Discuss / Python / 关于后面栈的读取进程pr的问题和 join方法应该放的位置问题

关于后面栈的读取进程pr的问题和 join方法应该放的位置问题

Topic source

alienation

#1 Created at ... [Delete] [Delete and Lock User]

既然后面的pr进程中运行的read函数里是死循环:

def read(q):
    print('Process to read: %s' % os.getpid())
    while True:
        value = q.get(True)
        print('Get %s from queue.' % value)

为什么输出结果的时候停在

Get C from queue.

这个结果这里不动了呢,死循环的话应该是不断输出

Get '' from queue.

这个语句才对。而结果是停在上述结果不动了,那么这个死循环最后究竟在循环什么语句呢?

pw.start()
pr.start()
pw.join()
pr.terminate()

对join的位置作了几次测试,发现join是用来把pr的启动和终止分割开,以防止pr进程启动即停止从而没有任何输出

但是这样子如果pw进程用时很短便结束了,而pr进程却需要耗费较多时间,会不会导致pr进程没有完全处理完队列的内容,结果就被终止了的情况发生呢?

alienation

#2 Created at ... [Delete] [Delete and Lock User]

测试了下,真的会发生,那么怎样才能正常结束这个pr进程呢?

🐹🐹

#3 Created at ... [Delete] [Delete and Lock User]

因为read进程的下面这行代码,队列的get操作默认是阻塞式的,即队列中没有元素,这个进程就会一直卡在这条命令

value = q.get(True)

write那边的函数里因为每次put存元素都有一个sleep的操作,所以最后是write存了第三个元素'C',然后该进程sleep,然后read进程把元素取出来打印。write进程sleep时间结束被唤醒,然后该进程结束,主进程main之前一直阻塞在join那里,write结束后主进程继续往后,执行pr.terminate(),read进程也结束。


  • 1

Reply