Я пытался научиться параллельному программированию и многопроцессорности в 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