d*****u 发帖数: 17243 | 1 程序需要往subprocess里不断输入数据,然后读出数据
python自带的那个communicate()必须等subprocess完成才返回数据,显然很多时候都
不好用
直接用stdin stdout经常会碰到deadlock | w****k 发帖数: 6244 | 2 two queues?
【在 d*****u 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 程序需要往subprocess里不断输入数据,然后读出数据 : python自带的那个communicate()必须等subprocess完成才返回数据,显然很多时候都 : 不好用 : 直接用stdin stdout经常会碰到deadlock
| m******1 发帖数: 95 | 3 mmap 吧,开两个文件当两个单向管道,一出一进。 | t*****s 发帖数: 416 | | d*****u 发帖数: 17243 | 5 我找到一个相对简单的办法,贴一下。
自己定义一个class,
read和write代替默认的读写方式
class Pipe(subprocess.Popen):
def __init__(self, argv, timeout = 0):
self.timeout = timeout
subprocess.Popen.__init__(self, argv, stdin = subprocess.PIPE,
stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
def write(self, data):
poll = select.poll()
poll.register(self.stdin.fileno(), select.POLLOUT)
fd = poll.poll(self.timeout)
if len(fd):
f = fd[0]
if f[1] > 0:
#self.stdin.write(data)
pickle.dump(data, self.stdin)
def read(self):
poll = select.poll()
poll.register(self.stdout.fileno(), select.POLLIN or select.POLLPRI)
fd = poll.poll(self.timeout)
if len(fd):
f = fd[0]
if f[1] > 0:
#return self.stdout.read()
return pickle.load(self.stdout) | i***r 发帖数: 1035 | 6 learned something, thanks |
|