2015-07-21 54 views
0

我正在使用套接字连接通过第三方API下载数据。它正常工作了一段时间,但每一个现在,然后我的脚本将崩溃给了以下错误:BrokenPipeError: [Errno 32] Broken pipe与套接字连接的破损管道

经过一番研究似乎建议(link here)是做到以下几点:

from signal import signal, SIGPIPE, SIG_DFL 

signal(SIGPIPE,SIG_DFL) 

但是IM首先不确定这实际上做了什么(即使阅读python信号手册,我仍然感到困惑)。而且我也不知道该把代码放在哪里。

如果任何人都熟悉这个错误,请你可以告知这是否是正确的解决方案,以及将放置哪个位置。是否应该在其中放置尝试/除外块,还是仅放置在程序的开始处?我很困惑。

下面是一些相关的代码。我基本上有一个由数千个项目组成的数据框。我遍历每个项目,将它传递给下载方法。下载方法通过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) 

回答

3

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

如果您的用例在以后的日期发生变化,您确实需要处理SIGPIPE,那么将其封装在try/except中并处理它将会有一段路要走。