gpt4 book ai didi

python - 无法打开由 Python 中的线程创建的管道描述符

转载 作者:行者123 更新时间:2023-11-28 18:47:07 26 4
gpt4 key购买 nike

刚开始研究python的pipe方法。我尝试将管道描述符包装到文件对象中并逐行读取。

import os,time,threading

def child():
while True:
time.sleep(1)
msg = ('Spam\n' ).encode()
os.write(pipeout,msg)


def parent():
while True:
a = os.fdopen(pipein)
line = a.readline()[:-1]
print('Parent %d got [%s] at %s' % (os.getpid(),line,time.time()))

pipein,pipeout = os.pipe()

threading.Thread(target=child,args=()).start()

parent()

当我运行脚本时,结果如下----脚本只在第一次迭代中运行,然后显示错误消息

Parent 621 got [Spam] at 1376785841.4  
Traceback (most recent call last):
File "/Users/miteji/pipe-thread.py", line 43, in <module>
parent()
File "/Users/miteji/pipe-thread.py", line 36, in parent
line = a.readline()[:-1]
IOError: [Errno 9] Bad file descriptor
>>> Exception in thread Thread-1:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 551, in __bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 504, in run
self.__target(*self.__args, **self.__kwargs)
File "/Users/miteji/pipe-thread.py", line 30, in child
os.write(pipeout,msg)
OSError: [Errno 32] Broken pipe

然而,当我改变

a = os.fdopen(pipein)
line = a.readline()[:-1]

line = os.read(pipein,32)

脚本工作正常。

那么为什么不能使用“os.fdopen”方法呢?为什么水管坏了?谢谢大家!

最佳答案

问题在于 os.fdopen 的位置:

def parent(): 
while True:
a = os.fdopen(pipein)
line = a.readline()[:-1]
print('Parent %d got [%s] at %s' % (os.getpid(),line,time.time()))

循环中的每一次旅行,你都调用 os.fdopen() ,即使你之前调用过。

第一次执行时,之前没有执行任何os.fdopen(),所以一切正常。但是第二次,这将 a 重新绑定(bind)到新结果,放弃了之前的 os.fdopen() 值。

当较早的值被放弃时,它就有资格进行垃圾回收。 CPython 立即通知(由于引用计数)并收集它。这将删除调用 os.fdclose() 的基础对象。反过来,关闭管道。

要解决眼前的问题,请确保只在循环外打开管道一次。

关于python - 无法打开由 Python 中的线程创建的管道描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18294708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com