Я использую соединение сокета для загрузки данных через сторонний API. Он отлично работает на некоторое время, но каждый сейчас и потом мой сценарий аварии дает следующее сообщение об ошибке: BrokenPipeError: [Errno 32] Broken pipe
Broken Pipe with socket connection
После некоторых исследований, кажется предположение (link here) должен сделать следующее:
from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE,SIG_DFL)
Однако им во-первых, не уверен, что это на самом деле делает (им все еще путают после прочтения руководства python по сигналу). И я также не знаю, куда поместить код.
Если кто-либо знаком с этой ошибкой, пожалуйста, не могли бы вы сообщить, правильно ли это решение, и где будет размещен signal(SIGPIPE,SIG_DFL)
. Должен ли быть блок try/except, внутри которого он находится, или он просто помещается в начале программы? Я смущен.
Вот некоторые из соответствующих кодов. У меня в основном есть dataframe, состоящий из нескольких тысяч элементов. Я прохожу через каждый элемент, передавая его методу загрузки. Метод загрузки загружает данные через 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)