나는 PyCon 이야기에서 (이 예를 이해하는 데 어려움을 겪고있어 링크 코드 예제를 )
import threading, time, random
##########################################################################################
# Fuzzing is a technique for amplifying race condition errors to make them more visible
FUZZ = True
def fuzz():
if FUZZ:
time.sleep(random.random())
###########################################################################################
counter = 0
def worker():
'My job is to increment the counter and print the current count'
global counter
fuzz()
oldcnt = counter
fuzz()
counter = oldcnt + 1
fuzz()
print('The count is %d' % counter, end='')
fuzz()
print()
fuzz()
print('---------------', end='')
fuzz()
print()
fuzz()
print('Starting up')
fuzz()
for i in range(10):
threading.Thread(target=worker).start()
fuzz()
print('Finishing up')
fuzz()
위의 내용은 다음과 같이 인쇄됩니다.
Starting up
The count is 1The count is 2The count is 2The count is 2
---------------The count is 3
---------------The count is 4
---------------
---------------The count is 4
The count is 5------------------------------
Finishing up
The count is 5
------------------------------
The count is 6---------------
---------------
이것에 대해 내가 이해하지 못하는 것은 때때로 스레드가 절전 모드로 전환 될 때 중단 된 지점에서 계속되고 다른 경우에는 중지하고 다음 반복을 시작하는 이유입니다.
편집하다:
모든 스레드가 완료 될 때까지 실행됩니다. 그것이 교훈의 요점입니다. 여러 스레드가 동일한 변수에 동시에 액세스하면 예기치 않은 결과가 발생할 수 있습니다.
덜 산만 한 내용과 스레드 ID를 인쇄하기 위해 코드를 약간 수정했습니다. 나는 이것이 무슨 일이 일어나고 있는지 명확히하는 데 도움이 될 것이라고 생각합니다.
import threading, time, random
##########################################################################################
# Fuzzing is a technique for amplifying race condition errors to make them more visible
FUZZ = True
def fuzz():
if FUZZ:
delay = random.random()
time.sleep(delay)
return delay
###########################################################################################
counter = 0
def worker(id):
'My job is to increment the counter and print the current count'
global counter
fuzz()
oldcnt = counter
delay = fuzz()
counter = oldcnt + 1
print('%d> After %s seconds, the count is %d -> %d' % (id, delay, oldcnt, counter))
print('Starting up')
fuzz()
for i in range(10):
threading.Thread(target=worker, args=(i,)).start()
fuzz()
print('Finishing up')
fuzz()
출력 예 (무작위성 때문에 각 실행이 변경됨) :
시작 0> 0.7350378311578315 초 후 카운트는 0-> 1 2> 0.1785671063273092 초 후 카운트는 1-> 2 1> 0.8294767498326181 초 후 카운트는 0-> 2 3> 0.5901283670333175 초 후 카운트는 다음과 같습니다. 1-> 3 4> 0.14964432977752684 초 후 카운트는 2-> 3 7> 0.07459495416247286 초 후 카운트는 2-> 3 5> 0.24680028896240813 초 후 카운트는 1-> 2 8> 0.18685884099452443 초 후 카운트는 3-> 4 마무리 6> 0.8512297712462166 초 후 카운트는 2-> 4 9> 0.5959592400151894 초 후 카운트는 4-> 5
변수가 저장 oldcnt = counter
될 때 ( )와 증가 할 때 (카운터 = oldcnt + 1) 사이의 임의의 수면 시간 때문에 데이터 경쟁이 발생합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다