Как добавить критическое ожидание в Python?

Вот код в котором перемножение происходит отдельно от процесса, нужно чтобы результат был такой же, но перемножение происходило внутри процесса.

from multiprocessing import Pool
from random import randint
import os

def potok(massiv):
    potoks = len(massiv)//2+1
    return potoks

def doubler(massiv):
    #print(number)
    result = 1
    proc = os.getpid()
    for index in massiv:
        #print(index)
        element = [ int(c) for c in str(index)]
        first = element[0]
        second = element[1]
        #print(first)
        #print(second)
        if first % 2 == second % 2:
            result *= first
            print('{0} Product {1} by process id: {2}'.format(massiv, result, proc))
        if result == 0:
            return 1
    return result


if __name__ == '__main__':
    n = randint(2, 10)
    matrix = [[randint(100, 999) for _ in range(n)] for _ in range(n)]
    print('Original matrix: ' + str(matrix))
    lst = []
    for line in matrix:
        lst += line
    print('Matrix elements: ' + str(lst))
    current_potoks = potok(matrix)
    pool = Pool(processes=current_potoks)
    print(current_potoks)
    result_process = (pool.map(doubler, matrix))
    result = 1
    for result_numbers in result_process:
        result *= result_numbers
    if result == 1:
        print('Not found valid numbers in matrix')
    else:
        print('Product of valid numbers: ' + str(result))

При попытке добавления действий с глобальной переменной внутри процесса получаю ошибки. Вот не рабочий код:

from multiprocessing import Pool
from random import randint
import os

def potok(massiv):
    potoks = len(massiv)//2+1
    return potoks

def doubler(massiv):
    #print(number)
    proc = os.getpid()
    for index in massiv:
        #print(index)
        element = [ int(c) for c in str(index)]
        first = element[0]
        second = element[1]
        #print(first)
        #print(second)
        if first % 2 == second % 2:
            global result
            result *= first
            print('{0} Product {1} by process id: {2}'.format(massiv, result, proc))


if __name__ == '__main__':
    result = 1
    n = randint(2, 10)
    matrix = [[randint(100, 999) for _ in range(n)] for _ in range(n)]
    print('Original matrix: ' + str(matrix))
    lst = []
    for line in matrix:
        lst += line
    print('Matrix elements: ' + str(lst))
    current_potoks = potok(matrix)
    pool = Pool(processes=current_potoks)
    print(current_potoks)
    result_process = (pool.map(doubler, matrix))
    #for result_numbers in result_process:
    #    result *= result_numbers
    if result == 1:
        print('Not found valid numbers in matrix')
    else:
        print('Product of valid numbers: ' + str(result))

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


Ответы (0 шт):