2015-07-21 90 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中並處理它將會有一段路要走。