Нужно ли нам когда-нибудь синхронизировать потоки в Python?Python

Программы на Python
Anonymous
Нужно ли нам когда-нибудь синхронизировать потоки в Python?

Сообщение Anonymous »

Согласно вики GIL, это указано
In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython's memory management is not thread-safe.
Когда несколько потоков пытаются одновременно выполнить какую-либо операцию с общей переменной, нам необходимо синхронизировать потоки, чтобы избежать состояний гонки. Мы достигаем этого, получая блокировку.
Но поскольку Python использует GIL, только одному потоку разрешено выполнять байт-код Python, поэтому с этой проблемой никогда не следует сталкиваться в случае программ Python - вот что Я подумал :( .Но я видел статью о синхронизации потоков в Python, где у нас есть фрагмент кода, вызывающий состояние гонки.
https://www.geeksforgeeks.org/multithre ... thon-set-2 -синхронизация/
Может кто-нибудь объяснить мне, как это возможно?
Код
import threading

# global variable x
x = 0

def increment():
"""
function to increment global variable x
"""
global x
x += 1

def thread_task():
"""
task for thread
calls increment function 100000 times.
"""
for _ in range(100000):
increment()

def main_task():
global x
# setting global variable x as 0
x = 0

# creating threads
t1 = threading.Thread(target=thread_task)
t2 = threading.Thread(target=thread_task)

# start threads
t1.start()
t2.start()

# wait until threads finish their job
t1.join()
t2.join()

if __name__ == "__main__":
for i in range(10):
main_task()
print("Iteration {0}: x = {1}".format(i,x))

Выход:
Iteration 0: x = 175005
Iteration 1: x = 200000
Iteration 2: x = 200000
Iteration 3: x = 169432
Iteration 4: x = 153316
Iteration 5: x = 200000
Iteration 6: x = 167322
Iteration 7: x = 200000
Iteration 8: x = 169917
Iteration 9: x = 153589


Подробнее здесь: https://stackoverflow.com/questions/738 ... -in-python

Вернуться в «Python»