2013-09-26 5 views
0

어떻게 현재 스레드 객체를 인스톨 할 수 있습니까?
다소 인공적인 코드 스 니펫을 고려하십시오. 유스 케이스는 다르지만, 간단하게하기 위해, 나는파이썬에서 현재 스레드를 인트로 스 케팅

t1 = threading.Thread(target=func) 
t2 = threading.Thread(target=func) 

marked_thread_for_cancellation = t1 

t1.start() 
t2.start() 

def func(): 
    if [get_thread_obj] is marked_thread_for_cancellation: # <== introspect here 
     return 
    # do something 
+0

threading.currentThread()가 현재 스레드를 제공합니까, 아니면 그 이상이 필요합니까? 스레드 로컬 데이터를 사용하여 스레드를 표시 할 수 있습니다. (어쩌면 내가 당신의 의도를 오해 한 것입니다.) –

답변

1

당신은 thread.get_ident 기능을 사용할 수있는 필수 비트 아래를 삶은했습니다. 다음과 같이 Thread.identthread.get_ident() 비교 :

import thread 
import threading 
import time 

marked_thread_for_cancellation = None 

def func(identifier): 
    while threading.get_ident() != marked_thread_for_cancellation: 
     time.sleep(1) 
     print('{} is alive'.format(identifier)) 
    print('{} is dead'.format(identifier)) 

t1 = threading.Thread(target=func, args=(1,)) 
t2 = threading.Thread(target=func, args=(2,)) 
t1.start() 
t2.start() 
time.sleep(2) 
marked_thread_for_cancellation = t1.ident # Stop t1 

파이썬 3에서, threading.get_ident를 사용합니다.

또한 thread.get_ident 대신 자신의 ID를 사용할 수 있습니다

import threading 
import time 

marked_thread_for_cancellation = None 

def func(identifier): 
    while identifier != marked_thread_for_cancellation: 
     time.sleep(1) 
     print('{} is alive'.format(identifier)) 
    print('{} is dead'.format(identifier)) 

t1 = threading.Thread(target=func, args=(1,)) 
t2 = threading.Thread(target=func, args=(2,)) 
t1.start() 
t2.start() 
time.sleep(2) 
marked_thread_for_cancellation = 1 # Stop t1 (`1` is the identifier for t1) 
1

이 코드에 최소한의 변경을하려면, 여기 당신이 무엇을 아마 후 :

import threading 

def func(): 
    if threading.current_thread() is marked_thread_for_cancellation: # <== introspect here 
     print 'cancel' 
    else: 
     print 'otherwise' 

t1 = threading.Thread(target=func) 
t2 = threading.Thread(target=func) 

marked_thread_for_cancellation = t1 

t1.start() 
t2.start() 

하지만 이해가 안 돼요 내성적 인 것의 의미는 무엇입니까? marked_thread_for_cancellation은 모든 스레드에서 공유하며, 모든 스레드는 로컬 데이터를 가지고 있습니다 (threading.local() 통해 액세스 가능).

+0

"컴퓨터 프로그래밍에서 인트로 스펙이란 무엇이 무엇인지, 무엇이 무엇인지, 그리고 무엇이 가능한지를 결정하는 것을 검사하는 능력을 말합니다." ([출처] (http://www.ibm.com/developerworks/library/l-pyint/index.html)). 이 경우 코드는 실행중인 스레드를 조사합니다. – Jonathan

+0

이것은 너무 광범위한 정의입니다. 거의 모든 프로그램이 내성 검사를 사용하고있을 수 있습니다. 리플렉션이 내성에 의해 이해 된 것을 더 잘 나타낼 수 있습니다. https://en.wikipedia.org/wiki/Reflection_%28computer_programming%29하지만 여전히 스레드 객체에 액세스하는 것은 거의 내적/반사라고 할 수 없습니다 ... –