2015-07-21 2 views
0

Я использую соединение сокета для загрузки данных через сторонний API. Он отлично работает на некоторое время, но каждый сейчас и потом мой сценарий аварии дает следующее сообщение об ошибке: BrokenPipeError: [Errno 32] Broken pipeBroken 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) 

ответ

3

SIGPIPE - это вещь POSIX, которая отправляется при сбое операции сокета. Поведение по умолчанию для сигнала (это вещь OS/socket, а не вещь Python), чтобы просто убить ваш процесс. Python вместо этого дает это вам как исключение, так что можно писать более надежные программы. Но если вам не нужно обрабатывать это событие, которое звучит так, будто вы не рассматриваете свой вариант использования, вы можете спокойно проигнорировать его. Нет никакой логики, которую вам нужно делать, когда вы получите сигнал, поэтому решение из этого сообщения в блоге должно быть в порядке. Никакой попытки/кроме необходимости.

Если ваш вариант использования изменяется позднее, и вам необходимо обработать SIGPIPE, тогда упаковка в процессе try/except и обработки его будет способом.

Смежные вопросы