无法打开受线程在Python创建的管道描述符

我刚开始研究蟒蛇的管法。 我试图管道描述包装成文件对象,并通过线读取。

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)

在scrips工作正常。

那么,为什么不能用“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新的结果,抛弃早期os.fdopen()值。

当早期的价值被放弃,它变得符合垃圾回收。 CPython的立即通告(由于引用计数),并收集它。 这将删除底层对象,这就要求os.fdclose() 即,反过来,关闭管道。

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

分类:蟒蛇 时间:2012-01-01 人气:0
本文关键词: 蟒蛇,多线程,管道
分享到:

相关文章

  • 对于蟒蛇多线程和多处理的解读错误 2012-06-04

    我想比较多线程和多python程序. 但是,我得到了解释错误: 文件"./parallelPython.py"23行时间fornorm(G,范围(100))^语法错误:无效的语法 的代码如下: #!/usr/bin/python -tt import numpy as np import math def f(x): print xy = [1]*10000000 [math.exp(i) for i in y] def g(x): print xy = np.ones(1000000

  • 蟒蛇多线程/多进程的代码 2014-06-16

    在下面的代码,我正在考虑使用辑阵线程或者多进程从URL获取. 我认为池将是理想的,谁能帮助建议的解决方案.. 理念:池线程/进程,采集数据......我的选择是过程结束线程,但不能肯定. import urllib URL = "http://download.finance.yahoo.com/d/quotes.csv?s=%s&f=sl1t1v&e=.csv" symbols = ('GGP', 'JPM', 'AIG', 'AMZN','GGP', 'JPM',

  • 蟒蛇 - 使用管道时调用子不终止 2014-11-21

    我有使用Python 2.6.5一个奇怪的问题. 如果我叫 p = subprocess.Popen(["ifup eth0"], shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() 与接口eth0的是向下,蟒蛇PROGRAMM挂起. "p.communicate()"需要一分钟或更长的时间才能完成. 如果接口之前到了,PROGRAMM顺利进行.

  • 对蟒蛇多线程_lsprof.c探查行为 2012-04-26

    这是一个关于Python原生的C文件_lsprof问题. 如何_lsprof.profile()分析器计数在多线程程序花费上的函数f的总时间,如果f的执行是由另一个线程打断? 例如: DEF F(): linef1 linef2 linef3 DEF G(): lineg1 lineg2 并在执行我们有,f和g在同一线程不是: linef1 linef2 lineg1 linef3 lineg2 然后将f的总运行时间被视为的需要做时间量: linef1 linef2 linef3 还是会成为有效

  • 蟒蛇多线程服务器 2013-04-14

    什么我想计划是一个有趣的简单的多线程蟒游戏服务器. 太多的无奈之后,我已经无法弄清楚,为什么我的测试客户端连接超时. 这里是我的server.py代码: import socket import threading import clientThread import struct import string class Server: def __init__(self): self.HOST = 'localhost' self.PORT = 22085 self.BUFFIZE = 102

  • 为什么蟒蛇多线程和队列不利于加快读取文件的一个大数目? 2013-08-15

    我写一个Python程序读取本地文件系统有关110000+文本文件,并将其推入MongoDB的. 这里是我的代码片段. 类EmailProducer(threading.Thread): def __init__(self, threadID, queue, path): self.threadID = threadID self.queue = queue self.path = path threading.Thread.__init__(self) def run(self): if (q

  • 蟒蛇多线程和打印为Windows 2013-11-04

    我已指示把已使用threading.Thread到现在使用multiprocessing.Process代码 我的主要问题是,我使用的是Windows和这些子功能希望能够在打印到的Python壳牌(IDLE) 没有任何人有如何做这方面的经验? 我的思绪在此刻: 子类multiprocessing.Process这样我就可以通过管道或队列子进程whcih将在覆盖_ _ 内置 .PRINT或sys.stdout.write函数的函数中使用 我还需要什么东西在父进程同时查询多个队列或管道,收集数据到的

  • 蟒蛇多线程进程运行的可执行文件 2014-03-09

    我想升级在Windows上运行的可执行文件,并管理文本文件输出到使用多个线程的进程,所以我可以利用多个内核版本的Python脚本. 我有每个线程都知道要访问可执行四个不同版本. 这部分工作正常. 凡我遇到的问题是,当它们同时运行,并尝试打开(不同的)输出文件,以确保它们能够正常运行,并根据不同的输出文件的内容作出反应. 具体来说,运行三个线程的时候,两人将与下面的错误崩溃,而一个继续工作: Exception in thread Thread-4: Traceback (most recent

  • 蟒蛇命名管道的问题 2014-04-03

    我试图建立双向通信beween一个守护进程,并使用命名管道的客户端. 该代码挂在尝试打开用于输入为什么命名管道? class comm(threading.Thread): def __init__(self): self.srvoutf = './tmp/serverout' self.srvinf = './tmp/serverin' if os.path.exists(self.srvoutf): self.pipein = open(self.srvoutf, 'r') #-------

  • 蟒蛇多线程“最大递归深度超过” 2014-10-21

    我使用Python多线程实现快速排序. 快速排序是在函数实现. 它是一个递归函数. 每个线程调用快速排序,以它的数组进行排序. 每个线程有其自己的阵列,其存储的数字需要进行排序. 如果数组的大小更小(<10,000). 它运行正常. 但是,如果该数组的大小较大时,它显示了"最大递归深度超过". 所以,我用setrecursionlimit()函数的递归深度重置为1500.但程序崩溃直接...以下是快速排序的代码. 它运作良好,如果不是在多线程环境. 看来多线程是递归深度问题的​​

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.193 (s). 10 q(s)