首页 > 解决方案 > 在使用并发期货时发出日志进程的功能

问题描述

我有一个使用并发期货调用的函数,以加快对极长项目列表的处理。在这个函数中,还有一个函数应该记录正在发生的事情并将其写入文本文件。然而,大概是由于 log 函数基本上同时从 task 函数内部被调用了很多,它没有捕获它应该捕获的所有内容。在下面的示例中,列表中有 120 个项目,每次我运行脚本时,我都会在文本文件中获得不同的行数,从低至 109 到高至 119。

from concurrent import futures

def task(numbers):
    total = numbers[0] + numbers[1]
    _log(numbers)
    return total

def _log(numbers):
    with open('log.txt', 'a+') as f:
        f.write('Adding '+str(numbers[0])+' and '+str(numbers[1])+'\n')

data = [ [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4],
         [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4],
         [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4],
         [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4],
         [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4],
         [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4],
         [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4],
         [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4],
         [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4],
         [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4], [1,1], [2,2], [3,3], [4,4]
    ]

ex = futures.ThreadPoolExecutor(max_workers = 60)
results = ex.map(task, data)

有没有办法解决这个问题,或者这只是使用并发期货的结果?

标签: pythonloggingconcurrency

解决方案


推荐阅读