2013-07-21 3 views
12

"스레드"모듈을 사용하여 파이썬 프로젝트에서 작업하고 있습니다.파이썬 스레드간에 공유 변수 만들기

나는 (내 경우에는 나는 참 또는 거짓 일 필요) 내 프로젝트의 모든 스레드 (4-6)에 액세스 할 수있는 전역 변수를 만들 수있는 방법

? 당신이 정말로 무엇을하려고에 관한 단서와

+4

실제로 무엇을하려고합니까? 어떤 종류의 "KeepRunning"변수가 필요하다면, 글로벌 변수보다 더 좋은 방법이있을 수 있습니다. – doctorlove

+1

무엇을 시도 했습니까? 질문에 대한 답변을 찾을 때 작동하지 않는 코드의 짧은 코드 예는 항상 도움이됩니다. –

+1

지구를 어떻게 만드는지 묻는 중입니까? 모듈 수준에서 선언 한 다음 defs 내의'global' 키워드를 사용하여 액세스하십시오. – roippi

답변

8

, 하나 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을 사용하여 항목을 사용할 수 있음을 나타냅니다.

15

우리는 스레드 클래스 외부 변수를 정의하고 클래스의 방법 내부는 글로벌 선언 할 수 있습니다.

AB를 번갈아 인쇄하는 간단한 예제를 참조하십시오. 두 변수 flagval은 두 개의 스레드 Thread_AThread_B 사이에서 공유됩니다. Thread_Aval=20을 인쇄 한 다음 val을 30으로 설정합니다. valThread_A으로 수정되었으므로 val=30 인 경우 Thread_B이 인쇄됩니다. Thread_Bval을 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 

같은 각 스레드 인쇄 다른 스레드에 수정 된 값을 보인다.

+0

'c '('threading.Condition()')가'global'으로 정의 된 이유는 무엇입니까? – Shai

관련 문제