如何使用threadpool.executor在线程之间共享计数器变量并将其递增?

时间:2019-06-25 19:54:22

标签: arrays python-3.x concurrent.futures

以下是我在python 3.x中实现的线程池执行程序

  with ThreadPoolExecutor(max_workers=15) as ex:
        f = open(filename, 'r', encoding='UTF-8')
        results = {ex.submit(callreadline, files ): files for files in f.readlines() }

结果变量包含以下格式的值:

words and their corresponding 200 dimensional embedding

您可以看到这些值是元组。第一个值是一个单词,第二个值是200维数组。值的总数为400000。所以有40万个元组。

现在我要做的是创建另一个执行以下任务的线程池执行程序

  1. 在元组列表中创建第一个值的有序字典。这意味着前4个元组值的说出的单词是 the is are 。然后排序的字典将包含:
  

{the:0,is:1,are:2,said:3,...…………….hello:399999}

  1. 创建一个numpy nd数组,其中包含有序字典中相应单词的200维数组(通过相应单词,我的意思是第一个条目将是单词 the 的200维数组,然后是200维的数组是 ...,该列表会继续显示)。因此numpy nd数组的尺寸为400000 * 200。

我正在使用以下代码进行循环

    count = 0
    word_to_idx = OrderedDict()
    vectors = []
    for future in results.result:
            b = future.result()
            word_to_idx[count] = b[0]
            if(count == 0):
                vectors =  np.array([b[1]])
            else:    
                vectors = np.append(vectors,np.array([b[1]]),axis=0)
            count = count +1

在上述函数的结尾,我返回了完成此工作的word_to_idx和向量。但是,循环400000个元组并将变量一一分配需要花费很长时间(大约10个小时)。

所以我在考虑是否有一种使用线程池执行程序并行化此功能的方法。

我当时正在考虑创建线程,然后与每个线程共享一个计数器变量,以便一次访问一个共享变量。然后,该线程将递增该变量,然后另一个线程将访问递增的计数器。有人可以指出我正确的方向吗?

编辑:

这是调用readline函数,它在15个工作人员被调用时运行得非常快:

def callreadline(line):
        # word_to_idx = OrderedDict() 
        word_to_idx = OrderedDict()
        vectors = []
        vocabulary = None
        word_to_idx = read_w2v_word(line.split(' ')[0])
        try:
            vectors = np.append(vectors, [np.array(line.split(' ')[1:])], axis=0)
        except:
            vectors = np.array(line.split(' ')[1:],dtype=float)
        if vocabulary is not None:
            word_to_idx, vectors = filter_words(word_to_idx, vectors, vocabulary)
        return word_to_idx,vectors

1 个答案:

答案 0 :(得分:0)

我觉得callreadline函数还没有达到尽可能快的速度,但这不是问题的一部分,所以让我尝试为您解决其余问题:

with ThreadPoolExecutor(max_workers=15) as ex:
        f = open(filename, 'r', encoding='UTF-8')
        results = [ex.submit(callreadline, files) for files in f.readlines()]

word_to_idx = dict()
vectors = []
for count, future in enumerate(results):
    b = future.result()
    word_to_idx[b[0]] = count
    vectors.append(b[1])

vectors = np.array(vectors)