[英]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.