簡體   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