我正在使用套接字連接通過第三方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)