-1

Я пытаюсь запустить несколько процессов для параллелизации определенных задач и чтобы одна глобальная переменная была уменьшена на 1 каждый раз, когда каждый процесс выполняет метод X().Глобальная переменная приращения с использованием модуля многопроцессорности python

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

from multiprocessing import Pool, Process 

def X(list): 
    global temp 
    print list 
    temp = 10 
    temp -= 1 
    return temp 

list = ['a','b','c'] 
pool = Pool(processes=5) 
pool.map(X, list) 

С помощью глобальной переменной, каждый процесс получает свою собственную копию глобальной переменной, которая не решает цель обмена это значение. Я считаю, что нужно иметь какую-то общую систему памяти, но я не уверен, как это сделать. Благодаря

+0

[Обмен состояния между процессами] (https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes) – chepner

+0

Я думаю, что вы ищете поддержку потоков Python - в частности, семафор. https://docs.python.org/2/library/threading.html – Prune

+0

Не совсем. Я хочу использовать несколько процессов, но также нужна общая переменная. Threading будет решать проблему с общей переменной, но не другие проблемы, для которых мне нужны несколько процессов. – psbits

ответ

1

Перемещения counter переменная в основной процесс т.е., избегает обмена переменного между процессами:

for result in pool.imap_unordered(func, args): 
    counter -= 1 

counter уменьшается, как только соответствующий результат (func(arg)) становится доступным. Вот полный пример кода:

#!/usr/bin/env python 
import random 
import time 
import multiprocessing 

def func(arg): 
    time.sleep(random.random()) 
    return arg*10 

def main(): 
    counter = 10 
    args = "abc" 
    pool = multiprocessing.Pool() 
    for result in pool.imap_unordered(func, args): 
     counter -= 1 
     print("counter=%d, result=%r" % (counter, result)) 

if __name__ == "__main__": 
    main() 

В качестве альтернативы можно передать объект multiprocessing.Value() к каждому рабочему процессу (использование initialize, initargsPool() «ы параметров).

+0

Thanks J.F. Как передать несколько аргументов с помощью map_unordered? Нужен ли мне какой-либо явный блокировка в этом подходе? – psbits

+0

@psbits: здесь вам не нужен мьютекс; 'counter' доступен только в одном процессе (основной процесс) -' counter' даже может быть локальным здесь. [Несколько аргументов - это другой вопрос] (http://stackoverflow.com/q/5442910/4279) – jfs

+0

Не уверен, что этот подход, похоже, не работает для меня, или если я делаю что-то неправильно. Я объявил счетчик в моей основной функции и вызвал функцию func, которая возвращает некоторую строку. Но значение счетчика все равно остается равным исходному значению. – psbits

Смежные вопросы