3

Я хочу, чтобы мой метод класса выполнялся параллельно, но он вызывает только некоторую ошибку, которую я не могу решить. Мой код:Почему я не могу использовать python module concurrent.futures в методе класса?

import concurrent.futures as futures 

samples = ['asfd', 'zxcv', 'asf', 'qwer'] 

class test: 
    def __init__(self, samples): 
     maturedb = {} 
     with futures.ProcessPoolExecutor() as exe: 
      for samplename, dResult in exe.map(self.make_readdb, samples): 
       maturedb[samplename] = dResult 
     print(maturedb) 

    def make_readdb(self, samplename): 
     return samplename, 1 

test(samples) 

Если я запускаю этот код в машине Ubuntu, об ошибке, как показано ниже происходит:

Traceback (most recent call last): 
    File "/usr/lib/python3.2/multiprocessing/queues.py", line 272, in _feedsend(obj) 
    _pickle.PicklingError: Can't pickle <class 'method'>: attribute lookup builtins.method failed 

Метод make_readdb только упрощена, чтобы сделать пример, но это узкое место в реальном коде и Мне нужно сделать его параллельным. Пожалуйста помоги.

+2

ваш код работает на Python 3.3 как есть – jfs

+0

Я тестировал свои коды на Python 3.5.2, и он работал хорошо. Большое спасибо всем вашим ответам. – user2028191

ответ

1

От docs:

Класс ProcessPoolExecutor является Палач подкласс, который использует пул процессов для выполнения вызовов асинхронно. ProcessPoolExecutor использует модуль многопроцессорности, который позволяет ему переходить на глобальный блокиратор Global , но также означает, что могут быть только выделенные объекты , выполненные и возвращенные.

Попробуйте ThreadPoolExecutor

Update

Я снова посмотрел на свой код, проблема в том, что функция - make_readdb - член класса test. Можете ли вы реорганизовать и вывести эту функцию?

+0

Многопоточность не помогает вообще. Поскольку cPython запускает только один поток за один раз, ThreadPoolExecutor делает его еще медленнее. В этом случае дизайн с одной нитью занял ~ 600 секунд, а ThreadPoolExecutor занял ~ 1300 секунд. – user2028191

+1

Связана ли ваша работа с процессором или привязана IO? Какую ценность вы использовали для max_workers? При вызове ProcessPoolExecutor по умолчанию будет указано количество процессоров на вашем компьютере. – Owen