"스레드"모듈을 사용하여 파이썬 프로젝트에서 작업하고 있습니다.파이썬 스레드간에 공유 변수 만들기
나는 (내 경우에는 나는 참 또는 거짓 일 필요) 내 프로젝트의 모든 스레드 (4-6)에 액세스 할 수있는 전역 변수를 만들 수있는 방법? 당신이 정말로 무엇을하려고에 관한 단서와
"스레드"모듈을 사용하여 파이썬 프로젝트에서 작업하고 있습니다.파이썬 스레드간에 공유 변수 만들기
나는 (내 경우에는 나는 참 또는 거짓 일 필요) 내 프로젝트의 모든 스레드 (4-6)에 액세스 할 수있는 전역 변수를 만들 수있는 방법? 당신이 정말로 무엇을하려고에 관한 단서와
, 하나 NIO의 접근 및 사용 잠금으로 이동하거나 조건 변수 고려 : 당신은이를 사용할 수 있습니다 docs
# Consume one item
cv.acquire()
while not an_item_is_available():
cv.wait()
get_an_available_item()
cv.release()
# Produce one item
cv.acquire()
make_an_item_available()
cv.notify()
cv.release()
에서
을 하나의 스레드가 잠금을 명시 적으로 생각할 필요없이 다른 조건이 충족되었다는 것을 알리십시오. 이 예제에서는 cv
을 사용하여 항목을 사용할 수 있음을 나타냅니다.
우리는 스레드 클래스 외부 변수를 정의하고 클래스의 방법 내부는 글로벌 선언 할 수 있습니다.
AB를 번갈아 인쇄하는 간단한 예제를 참조하십시오. 두 변수 flag
과 val
은 두 개의 스레드 Thread_A
과 Thread_B
사이에서 공유됩니다. Thread_A
은 val=20
을 인쇄 한 다음 val
을 30으로 설정합니다. val
은 Thread_A
으로 수정되었으므로 val=30
인 경우 Thread_B
이 인쇄됩니다. Thread_B
은 val
을 20으로 설정하고 다시 Thread_A
에서 사용합니다. 이는 변수 val
이 두 스레드간에 공유됨을 보여줍니다. 마찬가지로 변수 flag
은 두 스레드간에 공유됩니다.
import threading
import time
c = threading.Condition()
flag = 0 #shared between Thread_A and Thread_B
val = 20
class Thread_A(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
global flag
global val #made global here
while True:
c.acquire()
if flag == 0:
print "A: val=" + str(val)
time.sleep(0.1)
flag = 1
val = 30
c.notify_all()
else:
c.wait()
c.release()
class Thread_B(threading.Thread):
def __init__(self, name):
threading.Thread.__init__(self)
self.name = name
def run(self):
global flag
global val #made global here
while True:
c.acquire()
if flag == 1:
print "B: val=" + str(val)
time.sleep(0.5)
flag = 0
val = 20
c.notify_all()
else:
c.wait()
c.release()
a = Thread_A("myThread_name_A")
b = Thread_B("myThread_name_B")
b.start()
a.start()
a.join()
b.join()
출력
A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30
A: val=20
B: val=30
같은 각 스레드 인쇄 다른 스레드에 수정 된 값을 보인다.
'c '('threading.Condition()')가'global'으로 정의 된 이유는 무엇입니까? – Shai
실제로 무엇을하려고합니까? 어떤 종류의 "KeepRunning"변수가 필요하다면, 글로벌 변수보다 더 좋은 방법이있을 수 있습니다. – doctorlove
무엇을 시도 했습니까? 질문에 대한 답변을 찾을 때 작동하지 않는 코드의 짧은 코드 예는 항상 도움이됩니다. –
지구를 어떻게 만드는지 묻는 중입니까? 모듈 수준에서 선언 한 다음 defs 내의'global' 키워드를 사용하여 액세스하십시오. – roippi