Добавление значений в defaultdict (список) не работает при определении с помощью диспетчера многопроцессорности - PullRequest
0 голосов
/ 29 января 2019

Я использую многопроцессорность, чтобы разделить задачу на подпроцессы.Я создал общий словарь, настроив многопроцессорный менеджер для регистрации defaultdict (список).Подпроцессы обновляют этот словарь, используя значения для добавления, но словарь содержит только ключи, соответствующие значения отсутствуют.

from collections import defaultdict
from multiprocessing.managers import BaseManager, DictProxy
import multiprocessing as mp, io

class MyManager(BaseManager):
    pass

def process_read(chunkStart, chunkSize, doc_cluster, f_path):
    lock = mp.Lock()
    with io.open(f_path) as f_handle:
        f.seek(chunkStart)
        lines = f.read(chunkSize).splitlines()
        for line in lines:
            f_name = line.rstrip()
            key = some_processing()
            lock.acquire()
            try:
                doc_cluster[key].append(f_name)
            finally:
                lock.release()

if __name__ == '__main__':
    results = []
    cores = mp.cpu_count()
    pool = mp.Pool(cores)
    fp = 'B:/FN/FN_test.txt'
    MyManager.register('defaultdict', defaultdict, DictProxy)
    mgr = MyManager()
    mgr.start()
    d_cluster = mgr.defaultdict(list)
    for chunk_Start, chunk_Size in chunkify(fp):
        results.append(pool.apply_async(process_read, args=(chunk_Start, chunk_Size, d_cluster, fp,)))
    pool.close()
    pool.join()
    print d_cluster

Фактический результат:

{'cd': [], 'ab': [],' bc ': []}

Ожидаемый результат:

{' cd ': [f_name1, f_name2, f_name3],' ab ': [f_name5, f_name7],'bc': [f_name4, f_name6]}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...