2012-06-12 4 views
1

저는 파이썬에 초보자이며 파이썬에서 멀티 스레딩의 개념을 이해하려고 노력합니다. 유닉스 멀티 스레딩 프로그래밍에 대한 나의 지식에 따라 main 함수가 종료되면 main 함수에 의해 생성 된 스레드는 스레드에서 수행중인 작업과 관계없이 종료됩니다 (pthread_join() 함수를 사용하지 않는 경우) .파이썬에서의 멀티 스레딩에서 예기치 않은 동작이 발생했습니다.

그러나 파이썬에서 멀티 스레딩을 수행하는 동안이 기능이 표시되지 않습니다. 내 스레드가 여전히 작업을 완료하는 내 주 스레드가 성공적으로 실행되고 있습니다. 파이썬과 유닉스의 스레드가 다르게 동작한다는 것을 알고 싶습니다. 또는 뭔가 빠졌습니다. 파이썬에서이 스레드 기능을 이해하는 데 도움을주십시오. 다음은 파이썬에서 사용중인 코드입니다.

#! /usr/bin/python 
import logging 
import random 
import threading 
import time 

logging.basicConfig(level=logging.DEBUG, 
       format='(%(threadName)-10s) %(message)s', 
       ) 

class Counter(object): 

def __init__(self, start=0): 
    self.lock = threading.Lock() 
    self.value = start 

def increment(self): 
    logging.debug('Waiting for lock') 

    # Getting the Lock 
    self.lock.acquire() 
    try: 
     logging.debug('Acquired lock') 
     self.value = self.value + 1 
    finally: 
     # Releasing the Lock 
     self.lock.release() 



def worker(c): 
    for i in range(2): 
     pause = 4 
     logging.debug('Sleeping for %0.02f', pause) 
     time.sleep(pause) 
     c.increment() 
    logging.debug('Done') 



if __name__ == '__main__': 
    counter = Counter() 
    for i in range(2): 
     t = threading.Thread(target=worker, args=(counter,)) 
     t.start() 

    logging.debug('Counter: %d', counter.value) 
+0

그래서 ... 귀하의 질문은 무엇입니까? 이것은 정말로 모호합니다. 기능에 대해 설명했지만 실제 질문은 없습니다. –

답변

1

Thread.daemon에 대한 설명서의 내용을 확인하십시오. "살아있는 비 데몬 스레드가 남아 있지 않으면 전체 파이썬 프로그램이 종료됩니다."

0

불행히도, 파이썬 스레딩은 약간의 다른 스레드 스레딩입니다. 또한 GIL http://wiki.python.org/moin/GlobalInterpreterLock에 따르면 동시에 실행되는 스레드는 하나뿐입니다 (!)

또한 ... 메인 스레드가 종료되면 스레드가 완료 될 때까지 대기합니다 (setDaemon(True)으로 작성되지 않은 경우). 예를 들어 try에 의해 스레드를 중지하십시오. {주 스레드 코드} finally: doSomethingToStopThreads()

관련 문제