함수에서 :
a += 1
컴파일러 assign to a => Create local variable a
는 원하는 대로 해석 되지 않습니다. a not initialized
(로컬) a가 실제로 초기화되지 않았으므로 오류 와 함께 실패 할 수 있습니다.
>>> a = 1
>>> def f():
... a += 1
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
UnboundLocalError: local variable 'a' referenced before assignment
다음과 같이 (매우 눈살을 찌푸리고 좋은 이유로) global
키워드로 원하는 것을 얻을 수 있습니다 .
>>> def f():
... global a
... a += 1
...
>>> a
1
>>> f()
>>> a
2
그러나 일반적으로 매우 빨리 손에서 벗어난 전역 변수를 사용 하지 않아야합니다 . 그리고 이것은 수정 된 thread1
시기를 알 수있는 동기화 메커니즘이없는 다중 스레드 프로그램의 경우 특히 그렇습니다 a
. 간단히 말해 , 스레드는 복잡 하며 두 개 이상의 스레드가 동일한 값에서 작동 할 때 이벤트가 발생하는 순서를 직관적으로 이해할 수 없습니다. 언어, 컴파일러, OS, 프로세서 ... 모두가 역할을 수행 할 수 있으며 속도, 실용성 또는 기타 이유로 작업 순서를 수정할 수 있습니다.
이런 종류의 적절한 방법은 Python 공유 도구 ( 잠금
및 친구) 를 사용하는 것입니다 . 또는 더 나은 방법은 다음과 같이 공유하는 대신 큐 를 통해 데이터를 전달하는 것입니다.
from threading import Thread
from queue import Queue
import time
def thread1(threadname, q):
while True:
a = q.get()
if a is None: return
print a
def thread2(threadname, q):
a = 0
for _ in xrange(10):
a += 1
q.put(a)
time.sleep(1)
q.put(None)
queue = Queue()
thread1 = Thread( target=thread1, args=("Thread-1", queue) )
thread2 = Thread( target=thread2, args=("Thread-2", queue) )
thread1.start()
thread2.start()
thread1.join()
thread2.join()