繁体   English   中英

带插座连接的断管

[英]Broken Pipe with socket connection

我正在使用套接字连接通过第三方API下载数据。 它可以正常工作一段时间,但BrokenPipeError: [Errno 32] Broken pipe我的脚本会崩溃,并出现以下错误: BrokenPipeError: [Errno 32] Broken pipe

经过研究后,似乎建议( 链接在此处 )执行以下操作:

from signal import signal, SIGPIPE, SIG_DFL

signal(SIGPIPE,SIG_DFL)

但是我首先不确定这实际上是做什么的(我在阅读有关信号的python手册后仍然感到困惑)。 而且我也不知道将代码放在哪里。

如果有人熟悉此错误,请告知您这是否确实是正确的解决方案以及signal(SIGPIPE,SIG_DFL)放置位置。 应该在其中放置try / except块,还是只是将其放置在程序的开头? 我糊涂了。

这是一些相关的代码。 我基本上有一个包含数千个项目的数据框。 我遍历传递给下载方法的每个项目。 下载方法通过api下载数据,然后将其写入数据库。 然后,我移至下一个项目进行下载。

def recv_data(sock, recv_buffer=4096, delim='\n'):

    buffer = ''
    data = True
    while data:
        data = sock.recv(recv_buffer)
        buffer += str(data.decode('latin-1'))

        while buffer.find(delim) != -1:
            line, buffer = buffer.split('\n', 1)
            yield line

def update_existing_symbol_data(engine, sock, exchange, exchange_id, symbol, symbol_id, start_date):
    data = ''
    message = #request data message
    sock.sendall(message.encode())

    for line in recv_data(sock):
        if "!ENDMSG!" in line:
            break
        data += line[:-2] + '\n'

    df = pd.read_csv(io.StringIO(data))
    df.set_index('date', inplace=True)
    df.to_sql('daily', engine, if_exists='append')

def main():
    df = #dataframe all symbols that need to be downloaded
    for index, row in df.iterrows():
        update_existing_symbol_data(args)

SIGPIPE是POSIX,在套接字写操作失败时发送。 默认行为是信号(这是OS / socket的事情,而不是Python的事情)只是杀死您的进程。 相反,Python将它作为例外提供给您,以便可以编写更强大的程序。 但是,如果您不需要处理该事件(听起来好像您没有考虑用例),则可以放心地忽略它。 收到信号时,您无需执行任何逻辑,因此该博客文章中的解决方案应该很好。 无需尝试/需要。

如果您的用例在以后发生更改,并且您确实需要处理SIGPIPE,那么将其包装在try / except中并进行处理就可以了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM