首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python子进程管道块

Python子进程管道块
EN

Stack Overflow用户
提问于 2018-06-14 06:20:07
回答 1查看 74关注 0票数 1

由于某些原因,在本例中,consumer似乎被阻塞了(因为它正在等待EOF?)。但是管道的写入端应该是关闭的。

代码语言:javascript
复制
import os, subprocess, threading
(r, w) = os.pipe()

def producer():
    print '--producer started'
    subprocess.Popen(['echo', '123'], stdout=w).wait()
    print '--producer finished'
    os.close(w)
    print '--write pipe closed'

def consumer():
    print '--receiver started'
    subprocess.Popen(['cat'], stdin=r).wait()
    print '--receiver finished'
    os.close(r)
    print '--read pipe closed'

threading.Thread(target=producer).start()
threading.Thread(target=consumer).start()
EN

回答 1

Stack Overflow用户

发布于 2018-06-14 07:48:47

你的程序永远不会退出的原因是你在等待cat,除非cat正在等待一个永远不会出现的EOF。

当您调用subprocess.Popen(['cat'], stdin=r).wait()时,它从文件描述符中读取并将其打印到标准输出,因为您没有重定向标准输出。这就是为什么你仍然在屏幕上看到'123‘的原因。

请考虑以下任一选项:使用队列:

代码语言:javascript
复制
import threading
from Queue import Queue
q= Queue()

def producer():
    print '--producer started'
    q.put('123')
    print '--producer finished'

def consumer():
    print '--receiver started'
    print q.get()
    print '--receiver finished'

threading.Thread(target=producer).start()
threading.Thread(target=consumer).start()

或者使用os.pipe,但使用readwrite

代码语言:javascript
复制
import os, subprocess, threading
(r, w) = os.pipe()

def producer():
    print '--producer started'
    os.write(w, '123')
    print '--producer finished'
    os.close(w)
    print '--write pipe closed'

def consumer():
    print '--receiver started'
    print os.read(r, 3)
    print '--receiver finished'
    os.close(r)
    print '--read pipe closed'

threading.Thread(target=producer).start()
threading.Thread(target=consumer).start()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50847096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档