断线管与插座连接

时间:2015-07-21 05:28:36

标签: python sockets

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

经过一些研究后,似乎建议(link here)要做到以下几点:

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)

1 个答案:

答案 0 :(得分:3)

SIGPIPE是套接字写入操作失败时发送的POSIX事物。默认行为是信号(这是一个OS / socket事物,而不是Python的东西)来杀死你的进程。相反,Python将它作为一个例外提供给你,这样就可以编写更强大的程序。但是如果你不需要处理那个事件,听起来你没有考虑你的用例,你可以放心地忽略它。当您收到信号时,您无需做任何逻辑,因此该博客文章的解决方案应该没问题。没有尝试/除了需要。

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