2017-01-31 11 views
0

Когда я запускаю линию:Усеченного заголовок файла при использовании многопроцессорной

def book_processing(pair, pool_length): 
    p = Pool(len(pool_length)*3) 
    temp_parameters = partial(book_call_mprocess, pair) 
    p.map_async(temp_parameters, pool_length).get(999999) 
    p.close()         
    p.join() 
    return exchange_books 

Я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "test_code.py", line 214, in <module> 
    current_books = book_call.book_processing(cp, book_list) 
    File "/home/user/Desktop/book_call.py", line 155, in book_processing 
    p.map_async(temp_parameters, pool_length).get(999999) 
    File "/usr/lib/python2.7/multiprocessing/pool.py", line 567, in get 
    raise self._value 
zipfile.BadZipfile: Truncated file header 

Я чувствую, что есть некоторый ресурс, который используется, что Ждет» t закрыть во время последнего цикла, но я не уверен, как его закрыть (все еще изучая многопроцессорную библиотеку). Эта ошибка возникает только тогда, когда мой код довольно быстро повторяет этот раздел (в течение одной минуты). Это происходит не часто, но ясно, когда это происходит.

Edit (добавление кода book_call):

def book_call_mprocess(currency_pair, ex_list): 

    polo_error = 0 
    live_error = 0 
    kraken_error = 0 
    gdax_error = 0 

    ex_list = set([ex_list]) 

    ex_Polo = 'Polo' 
    ex_Live = 'Live' 
    ex_GDAX = 'GDAX' 
    ex_Kraken = 'Kraken' 

    cp_polo = 'BTC_ETH' 
    cp_kraken = 'XETHXXBT' 
    cp_live = 'ETH/BTC' 
    cp_GDAX = 'ETH-BTC' 

    # Instances 
    polo_instance = poloapi.poloniex(polo_key, polo_secret) 
    fookraken = krakenapi.API(kraken_key, kraken_secret) 
    publicClient = GDAX.PublicClient() 

    flag = False 
    while not flag: 
     flag = False 
     err = False 

     # Polo Book 

     try: 
      if ex_Polo in ex_list: 
       polo_books = polo_instance.returnOrderBook(cp_polo) 
       exchange_books['Polo'] = polo_books 
     except: 
      err = True 
      polo_error = 1 

     # Livecoin 

     try: 
      if ex_Live in ex_list: 
       method = "/exchange/order_book" 
       live_books = OrderedDict([('currencyPair', cp_live)]) 
       encoded_data = urllib.urlencode(live_books) 
       sign = hmac.new(live_secret, msg=encoded_data, digestmod=hashlib.sha256).hexdigest().upper() 
       headers = {"Api-key": live_key, "Sign": sign} 
       conn = httplib.HTTPSConnection(server) 
       conn.request("GET", method + '?' + encoded_data, '', headers) 
       response = conn.getresponse() 
       live_books = json.load(response) 
       conn.close() 
       exchange_books['Live'] = live_books 
     except: 
      err = True 
      live_error = 1 

     # Kraken 

     try: 
      if ex_Kraken in ex_list: 
       kraken_books = fookraken.query_public('Depth', {'pair': cp_kraken}) 
       exchange_books['Kraken'] = kraken_books 
     except: 
      err = True 
      kraken_error = 1 

     # GDAX books 

     try: 
      if ex_GDAX in ex_list: 
       gdax_books = publicClient.getProductOrderBook(level=2, product=cp_GDAX) 
       exchange_books['GDAX'] = gdax_books 
     except: 
      err = True 
      gdax_error = 1 

     flag = True 
     if err: 
      flag = False 
      err = False 
      error_list = ['Polo', polo_error, 'Live', live_error, 'Kraken', kraken_error, 'GDAX', gdax_error] 
      print_to_excel('excel/error_handler.xlsx', 'Book Call Errors', error_list) 
      print "Holding..." 
      time.sleep(30) 
     return exchange_books 


def print_to_excel(workbook, worksheet, data_list): 
    ts = str(datetime.datetime.now()).split('.')[0] 
    data_list = [ts] + data_list 
    wb = load_workbook(workbook) 
    if worksheet == 'active': 
     ws = wb.active 
    else: 
     ws = wb[worksheet] 
    ws.append(data_list) 
    wb.save(workbook) 
+0

Для меня это похоже на то, что разные процессы совместно используют один путь к файлу (например, zipfile в каталоге temp), который один записывает, а другой читает одновременно, пока он не полностью написан. Можете ли вы поделиться кодом, связанным с zipfile, в функции 'book_processing'? – hansaplast

+0

Я не уверен, куда входит zipfile. Я пишу в файл excel, который может быть и этим. Я добавил код с помощью редактирования. Я также добавил мою функцию print_to_excel. – mee

+0

который является файлом «test_code.py», строка 214, в '? И: можете ли вы исправить отступы? (лучше всего вставить исходный код, затем выбрать его и нажать ctrl-k) – hansaplast

ответ

0

Проблема заключается в функции print_to_excel

И более конкретно здесь:

wb = load_workbook(workbook) 

Если два процессы выполнения этой функции в то же время вы столкнетесь с следующим гоночным состоянием:

  • Процесс 1 хочет открыть error_handler.xlsx, так как он не существует, он создает пустой файл
  • Process 2 хочет открыть error_handler.xlsx, он делает существует, поэтому он пытается прочитать его, но он по-прежнему пуст. Поскольку формат xlsx просто почтовый файл, состоящий из кучи файлов XML, процесс ожидает действительный почтовый заголовок, в котором он не находит и не включает zipfile.BadZipfile: Truncated file header

То, что выглядит странно, хотя это ваше сообщение об ошибке, как в стек вызовов я бы ожидал увидеть print_to_excel и load_workbook.

Во всяком случае, так как вы подтвердил, что проблема действительно в XLSX обработки вы можете

  • генерировать новое имя файла с помощью tempfile для каждого процесса
  • использования locking гарантировать, что только один процесс проходит print_to_excel в a

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

  • Нет связанных вопросов^_^