Многопроцессорность в Python совместима с 3 до 2,7 - PullRequest
0 голосов
/ 06 ноября 2018

У меня следующий код работает в Python 3 плавно, и я не могу преобразовать его в Python 2.7.

from multiprocessing import *

def func(path, filename, path_2):
    #Things to do

for i in range(0,len(chr_names)): #len(chr_names) = 24
    tuple_var.append((path, chr_names[i][0], chrom_sizes[i][0]))

cores = 4
with Pool(cores) as p:
    p.starmap(func, tuple_var)

Я получаю следующую ошибку.

python AttributeError: __exit__

Я знаю, что starmap не поддерживается в Python 2.7.

Какой код я должен использовать в Python 2.7?

Ответы [ 4 ]

0 голосов
/ 06 ноября 2018

Первый:

В Python 2.x и 3.0, 3.1 и 3.2 multiprocessing.Pool () объекты не являются менеджерами контекста

Посмотрите на этот пост для получения дополнительной информации: Ошибка Lib многопроцессорной обработки Python (AttributeError: __exit __)

Второе:

Использовать вспомогательную функцию

Или выберите один из других вариантов, представленных здесь: Многопроцессорная обработка с несколькими аргументами для работы в Python 2.7

Пример кода:

from contextlib import contextmanager
from multiprocessing import *

@contextmanager
def terminating(thing):
    try:
        yield thing
    finally:
        thing.terminate()

def func(path, filename, path_2):
    # Things to do
    print(path)
    print(filename)
    print(path_2)
    print('-----------------------------\n')

def helper(args):
    return func(args[0], args[1], args[2])

def task():
    tuple_var = []
    for i in range(0, 10):
        tuple_var.append(('hi_' + str(i), i, i))

    with terminating(Pool(processes=2)) as p:
        p.map(helper, tuple_var)

if __name__ == '__main__':
    task()
0 голосов
/ 06 ноября 2018

Если я не понимаю вас, похоже, вы можете использовать функцию карты Pool в Python 2.6+. Все, что вам нужно, это функция, которая может применять аргументы кортежа к исходной функции. Что-то вроде:

def pool_starmap(pool, fn, items):
    def map_fn(args):
        fn(*args)
    return pool.map(map_fn, items)

cores = 4
with Pool(cores) as p:
    pool_starmap(p, func, tuple_var)
0 голосов
/ 06 ноября 2018

В других ответах уже рассказывалось о том, как вы можете портировать starmap, но что касается ошибки AttributeError: __exit__, то это связано с тем, что multiprocessing.Pool нельзя использовать в качестве диспетчера контекста в Python 2.7, так что вы просто вместо этого нужно сделать следующее:

p = Pool(cores)
0 голосов
/ 06 ноября 2018

Один простой подход, используйте функцию-обертку:

def star_wrapper(args):
    return func(*args)

....

with Pool(cores) as p:
    p.map(star_wrapper, tuple_var)
...