首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多处理时截断文件头

使用多处理时截断文件头
EN

Stack Overflow用户
提问于 2017-01-31 03:59:55
回答 1查看 3.1K关注 0票数 0

当我运行线路时:

代码语言:javascript
复制
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

我得到以下错误:

代码语言:javascript
复制
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

我觉得好像有一些资源正在被使用,在上一个循环中没有关闭,但是我不知道如何关闭它(还在学习多进程库)。只有当我的代码相对较快地重复此部分时(在同一分钟内),才会发生此错误。这种情况并不经常发生,但当发生这种情况时是清楚的。

编辑(添加book_call代码):

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-01 06:01:36

问题在于函数print_to_excel

更具体地说,在这里:

代码语言:javascript
复制
wb = load_workbook(workbook)

如果两个进程同时运行此函数,则会遇到以下争用条件:

  • Process 1希望打开error_handler.xlsx,因为它不存在,所以它创建了一个空文件
  • Process 2想打开error_handler.xlsx,它确实存在,所以它尝试读取它,但是它仍然是空的。由于xlsx格式只是一个由一堆XML文件组成的压缩文件,因此该过程需要一个有效的zip头,但它没有找到,并且省略了zipfile.BadZipfile: Truncated file header

但是,看起来奇怪的是您的错误消息,就像我希望看到的调用堆栈中的print_to_excelload_workbook一样。

无论如何,既然您确认了问题确实存在于XLSX处理中,那么您可以

  • 通过tempfile为每个进程生成一个新的文件名
  • 使用locking确保一次只有一个进程运行print_to_excel
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41949426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档