time.sleep으로 파이썬 스레딩

public_secrets

나는 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---------------
---------------

이것에 대해 내가 이해하지 못하는 것은 때때로 스레드가 절전 모드로 전환 될 때 중단 된 지점에서 계속되고 다른 경우에는 중지하고 다음 반복을 시작하는 이유입니다.

편집하다:

  • 나는 분명히 for 루프를 놓쳤다 ...
조니 몹

모든 스레드가 완료 될 때까지 실행됩니다. 그것이 교훈의 요점입니다. 여러 스레드가 동일한 변수에 동시에 액세스하면 예기치 않은 결과가 발생할 수 있습니다.

덜 산만 한 내용과 스레드 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

QThread : GUI 파이썬으로 스레딩

분류에서Dev

스레딩이 잘못된 파이썬 로거

분류에서Dev

파이썬 문제로 스레딩 (dht22)

분류에서Dev

파이썬 로그인을위한 스레딩

분류에서Dev

파이썬. 스레딩

분류에서Dev

파이썬 time.sleep 무기한

분류에서Dev

파이썬 : 디스크 바인딩 작업, 스레드 대 프로세스

분류에서Dev

Thread.Sleep ()으로 로딩 시뮬레이션

분류에서Dev

이 코드는 파이썬 스레딩 모듈로 안전합니까?

분류에서Dev

파일로 스레딩

분류에서Dev

멀티 다운로드에 스레딩을 사용하는 파이썬 방법

분류에서Dev

멀티 스레딩 프로그램 (파이썬)을 만들어야합니다.

분류에서Dev

파이썬 스크립트가 배치 파일에서 % time %를 엉망으로 만듭니다.

분류에서Dev

Python으로 udp 데이터 스레딩

분류에서Dev

스레드에서 스레딩으로 마이그레이션

분류에서Dev

스레드로부터 안전한 파이썬 스레딩 대기열 생산자 소비자

분류에서Dev

파이썬 스레딩 어려움

분류에서Dev

파이썬 스레딩 추측 게임

분류에서Dev

Kivy 파이썬으로 레이블 텍스트 변경

분류에서Dev

파이썬 스크립트의 이름을 파이썬으로 파이핑

분류에서Dev

파일을 다운로드하기 위해 파이썬에서 다중 처리 / 다중 스레딩

분류에서Dev

파이썬에서 멀티 스레딩을 사용하여 파일 다운로드

분류에서Dev

파이썬에서 time.sleep () 때 이상한 IOError

분류에서Dev

파이썬 : 플래그를 기반으로 스레드 실행

분류에서Dev

파이썬 3 time.sleep () "직렬 읽기"

분류에서Dev

동적 로딩 페이지의 파이썬 웹 스크래핑

분류에서Dev

파이썬 스레드가 스레딩이 아닙니다.

분류에서Dev

파이썬 크로스 컴파일

분류에서Dev

메인이 여전히 파이썬에서 실행되는 동안 스레딩을 사용하여 사용자 입력을 실시간으로 얻는 방법

Related 관련 기사

  1. 1

    QThread : GUI 파이썬으로 스레딩

  2. 2

    스레딩이 잘못된 파이썬 로거

  3. 3

    파이썬 문제로 스레딩 (dht22)

  4. 4

    파이썬 로그인을위한 스레딩

  5. 5

    파이썬. 스레딩

  6. 6

    파이썬 time.sleep 무기한

  7. 7

    파이썬 : 디스크 바인딩 작업, 스레드 대 프로세스

  8. 8

    Thread.Sleep ()으로 로딩 시뮬레이션

  9. 9

    이 코드는 파이썬 스레딩 모듈로 안전합니까?

  10. 10

    파일로 스레딩

  11. 11

    멀티 다운로드에 스레딩을 사용하는 파이썬 방법

  12. 12

    멀티 스레딩 프로그램 (파이썬)을 만들어야합니다.

  13. 13

    파이썬 스크립트가 배치 파일에서 % time %를 엉망으로 만듭니다.

  14. 14

    Python으로 udp 데이터 스레딩

  15. 15

    스레드에서 스레딩으로 마이그레이션

  16. 16

    스레드로부터 안전한 파이썬 스레딩 대기열 생산자 소비자

  17. 17

    파이썬 스레딩 어려움

  18. 18

    파이썬 스레딩 추측 게임

  19. 19

    Kivy 파이썬으로 레이블 텍스트 변경

  20. 20

    파이썬 스크립트의 이름을 파이썬으로 파이핑

  21. 21

    파일을 다운로드하기 위해 파이썬에서 다중 처리 / 다중 스레딩

  22. 22

    파이썬에서 멀티 스레딩을 사용하여 파일 다운로드

  23. 23

    파이썬에서 time.sleep () 때 이상한 IOError

  24. 24

    파이썬 : 플래그를 기반으로 스레드 실행

  25. 25

    파이썬 3 time.sleep () "직렬 읽기"

  26. 26

    동적 로딩 페이지의 파이썬 웹 스크래핑

  27. 27

    파이썬 스레드가 스레딩이 아닙니다.

  28. 28

    파이썬 크로스 컴파일

  29. 29

    메인이 여전히 파이썬에서 실행되는 동안 스레딩을 사용하여 사용자 입력을 실시간으로 얻는 방법

뜨겁다태그

보관