Что на самом деле делает блокировка в многопроцессорной обработке? - PullRequest
0 голосов
/ 11 ноября 2018

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

import multiprocessing 
# function to withdraw from account 
def withdraw(balance, lock):     
    for _ in range(10): 
        lock.acquire() 
        print("with")
        balance.value = balance.value - 1
        lock.release() 
# function to deposit to account 
def deposit(balance, lock):     
    for _ in range(10): 
        lock.acquire()
        print("depp")
        balance.value = balance.value + 1
        lock.release() 

def perform_transactions(): 
    # initial balance (in shared memory) 
    balance = multiprocessing.Value('i', 100) 
    # creating a lock object 
    lock = multiprocessing.Lock() 
    # creating new processes 
    p1 = multiprocessing.Process(target=withdraw, args=(balance,lock)) 
    p2 = multiprocessing.Process(target=deposit, args=(balance,lock))   
    # starting processes 
    p1.start() 
    p2.start() 
    # wait until processes are finished 
    p1.join() 
    p2.join() 
    # print final balance 
    print("Final balance = {}".format(balance.value)) 
if __name__ == "__main__": 
    for _ in range(10):   
        # perform same transaction process 10 times 
        perform_transactions()       

первый вывод:

с с с с с с с с с с депп депп депп депп депп депп депп депп депп депп Конечный баланс = 100

Я думал, что это будет что-то вроде "dep with dep с ... и т. Д.", Но он печатает dep десять раз и с 10 разами, что означает, что он сначала выполнял весь процесс без параллелизма. Было бы разумно, если бы «lock.acquire ()» был до цикла, а «lock.release ()» был после цикла.
Еще один странный вывод

with
with
with
depp
depp
depp
depp
depp
depp
depp
depp
depp
depp
with
with
with
with
with
with
with
Final balance = 100
...