Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用管道时关闭套接字连接_Python_Sockets_Pipe - Fatal编程技术网

如何在Python中使用管道时关闭套接字连接

如何在Python中使用管道时关闭套接字连接,python,sockets,pipe,Python,Sockets,Pipe,我正处于这样一种情况: 我的脚本打开到远程数据库的套接字连接, 获取对远程数据库执行SQL语句时返回的迭代器, 迭代迭代器并打印值 由于SQL通常返回大量记录,因此我经常以管道方式使用脚本,即python script.py | head-10。当然,当我用管道将它输送到头部时,会出现套接字错误。对异常的修复是: from signal import signal, SIGPIPE, SIG_DFL signal(SIGPIPE,SIG_DFL) 我的问题是,对于管道,例如head-5,数据库

我正处于这样一种情况:

我的脚本打开到远程数据库的套接字连接, 获取对远程数据库执行SQL语句时返回的迭代器, 迭代迭代器并打印值 由于SQL通常返回大量记录,因此我经常以管道方式使用脚本,即python script.py | head-10。当然,当我用管道将它输送到头部时,会出现套接字错误。对异常的修复是:

from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE,SIG_DFL)
我的问题是,对于管道,例如head-5,数据库套接字连接是自动关闭的还是正确关闭的?如果没有,我如何在脚本中关闭它,以防使用管道

代码结构如下所示:

def getIter(n, conn):
  for i in xrange(n):
    yield i

def p(l):
  for x in l:
    print x

if __name__ == '__main__':
  # dbms_socket_conn.open() 

  # get iterator 
  ii = getIter(100, conn=None)
  p(ii)

  print "is the dbms connection got closed in case of pipe (e.g. head -5) ?"
  # dbms_socket_conn.close()

你可以这样做:

try:
    # dbms_socket_conn.open() 

    # get iterator 
    ii = getIter(100, conn=None)
    p(ii)

    print "is the dbms connection got closed in case of pipe (e.g. head -5) ?"
finally:
    # dbms_socket_conn.close()
确保代码执行close方法

编辑: head-5只显示输出的前5行,但这并不意味着脚本停止。如果您尝试以下方法:

from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE,SIG_DFL)

def getIter(n, conn):
  for i in xrange(n):
    yield i

def p(l):
  for x in l:
    print x

if __name__ == '__main__':
    try:
        ii = getIter(100, conn=None)
        p(ii)
    finally:
        with open("test.txt","w") as f:
            f.write("asdasdasdasd")

您将看到文件被写入,这意味着finally子句被执行。你应该把dbms_插座连接放在那里。关闭

我认为它对管道外壳不起作用。对于管道,求值根本没有到达finally语句,例如python script.py | head-5.Oh,这很奇怪,如果您查看它,会发现finally子句总是在离开try语句之前执行,无论是否发生异常。。。如果脚本因为管道而停止,它应该抛出一个异常或类似的东西,然后执行finally语句。尝试OP中的代码,并执行python script.py | head-5,它不会抛出异常,我认为这很好,但需要一种方法让脚本知道它已完成,以便可以关闭连接。您完全正确:head-5只显示输出的前5行,但这并不意味着脚本停止。无论出于何种原因,我认为pipe也会在适当的时候终止正在这里进行管道传输的程序script.py。我认为管道是调整脚本的一种实用方法。在数据库的情况下,假设一个查询产生100万条记录,我认为| head-10将在获取10条记录或数据库连接缓存大小时终止查询,从而避免进一步的RPC。