какова точная функция получения и выпуска в python многопоточном программировании - PullRequest
0 голосов
/ 20 апреля 2020

привет, я новичок в многопоточном программировании в Pyhton , насколько мне известно, в многопоточном программировании в python объект блокировки может заблокировать процесс потока, например, в коде ниже self.lock.acquire () установит режим блокировки объекта на блокировку, и все остальные потоки, которые сталкиваются с self.lock.acquire, остановятся, пока объект блокировки не будет разблокирован, а затем код под self.lock .acquire выполняется очень точно, когда вы делаете блокируемый объект, его состояние по умолчанию разблокируется, когда он встречает

self.lock.acquire, затем он устанавливается на блокировку и другие потоки, которые будут сталкиваться с (self. lock.acquire) тогда, поскольку он установлен на блокировку, будет ждать и ничего не будет сделано, пока объект блокировки не будет разблокирован с помощью self.lock.realese, тогда self.lock.acquire снова установит объект блокировки в режим блокировки, а затем продолжит до тех пор, пока достигает объекта realese, но вопрос здесь, если данные распределяются между более чем двумя потоками, что происходит Например, код ниже g распределяется между тремя потоками. Единственное, что я могу себе представить, это то, что он не является многопоточным, потому что, когда вызывается функция realese в add_one, и мы знаем, что оператор self.lock.acquire заблокирован в обеих функциях. или поток функций add_two и add_three, поэтому, что здесь произойдет, он сначала выполнит self.lock.acquire функции add_two, а затем из-за чего мы теперь заблокируем функцию add_three или как ?? так скажи мне точно, что здесь будет

from threading import Lock, Thread

lock = Lock()
 g = 0


def add_one():
"""
Just used for demonstration. It’s bad to use the ‘global’
statement in general.
"""

global g
lock.acquire()
g += 1
lock.release()


def add_two():
    global g
    lock.acquire()
    g += 2
    lock.release()

 def add_three():
   global g
   lock.acquire()
   g += 2
   lock.release()


threads = []
for func in [add_one, add_two,add_three]:
threads.append(Thread(target=func))
threads[-1].start()

for thread in threads:
       thread.join()
print(g) 
...