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