我使用套接字连接通过第三方API下载数据。它工作正常一段时间,但我的脚本会不时崩溃,并出现以下错误:BrokenPipeError: [Errno 32] Broken pipe
经过一些研究后,似乎建议(link here)要做到以下几点:
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)
答案 0 :(得分:3)
SIGPIPE是套接字写入操作失败时发送的POSIX事物。默认行为是信号(这是一个OS / socket事物,而不是Python的东西)来杀死你的进程。相反,Python将它作为一个例外提供给你,这样就可以编写更强大的程序。但是如果你不需要处理那个事件,听起来你没有考虑你的用例,你可以放心地忽略它。当您收到信号时,您无需做任何逻辑,因此该博客文章的解决方案应该没问题。没有尝试/除了需要。
如果您的用例在以后更改并且您确实需要处理SIGPIPE,那么将其包装在try / except中并处理它就可以了。