파이썬 스레드는 바이트 코드를 한 번에 하나씩 만 실행할 수 있다는 것을 알고 있습니다. 따라서 threading 라이브러리가 잠금을 제공하는 이유는 무엇입니까? 한 번에 하나의 스레드 만 실행 중이면 경쟁 조건이 발생할 수 없다고 가정합니다.GIL을 준수하는 경우 Python이 잠금 메커니즘을 제공하는 이유는 무엇입니까?
라이브러리는 잠금, 조건 및 세마포어를 제공합니다. 실행을 동기화하는 유일한 목적입니까? 업데이트
: 나는 작은 실험을 수행
: 결과가 반환 1. 에 의해 기본적으로
from threading import Thread
from multiprocessing import Process
num = 0
def f():
global num
num += 1
def thread(func):
# return Process(target=func)
return Thread(target=func)
if __name__ == '__main__':
t_list = []
for i in xrange(1, 100000):
t = thread(f)
t.start()
t_list.append(t)
for t in t_list:
t.join()
print num
내가 100,000 스레드를 시작 증가해야했다 99993.
A) GIL 동기화 및 피싱 경쟁 조건이있는 경우 어떻게 결과가 99999가 될 수 있습니까? b) 100k OS 스레드를 시작할 수 있습니까?
업데이트 2, 답변보고 후 다음 GIL 정말 원자 증가와 같은 간단한 작업을 수행 할 수있는 방법, 거기있는의 목적은 무엇을 제공하지 않는 경우
를? 그것은 불쾌한 동시성 문제 때문에 도움이되지 않습니다. C- 확장에 대한 사용 사례를 들었는데 누군가가 이것을 증명할 수 있습니까?
GIL은 코드 작성보다는 동시성 문제로부터 Python 인터프리터 자체를 보호합니다. 이것은 실제로 CPython의 구현 세부 사항입니다. 여러분의 코드에서 동작을 의존해서는 안되며, 곧 없어지지는 않을 것입니다. – dano