2014-11-06 2 views
1

Python 응용 프로그램 폴더를 감시하고 특정 새 파일이나 변경된 파일을 서버에 업로드합니다. 작업 큐로서 나는 Queue 모듈과 작업자 스레드 풀을 사용하고 있습니다.스레드에서 작업 실행을 취소하고 대기열에서 작업을 제거합니다.

때때로 업로드하는 동안 파일이 변경되고 업로드를 취소하고 다시 시작해야합니다.

threading.Event으로 스레드 실행을 중지하는 방법을 알고 있지만 대기열에서 작업을 제거하거나 이동하려면 어떻게해야합니까?

답변

1

가 취소 된대로 Queue에로드 한 예를 표시하는 것이 가장 쉬운 방법 : 당신의 소모 스레드에서 그런

class Task(object): 
    def __init__(self, data): 
     self.cancelled = False 
     self.data = data 

    def cancel(self): 
     self.cancelled = True 

q = Queue.Queue() 
t = Task("some data to put in the queue") 
q.put(t) 

# Later 
t.cancel() 

는 :

task = q.get() 
if task.cancelled: 
    # Skip it 
else: 
    # handle it. 

또한 가능하다 Queue이 내부적으로 사용하는 deque과 직접 상호 작용하려면 Queue에 대한 동기화 동기화에 사용되는 내부 뮤텍스를 획득해야합니다.

>>> import Queue 
>>> q = Queue.Queue() 
>>> q.put("a") 
>>> q.put("b") 
>>> q.put("c") 
>>> q.put("d") 
>>> q.queue[2] 
'c' 
>>> q.queue[3] 
'd' 
>>> with q.mutex: # Always acquire the lock first in actual usage 
... q.queue[3] 
... 
'd' 

이 작동해야하지만, Queue의 내부 덤비는 것은 권장되지 않으며, 파이썬 버전에서 깨질 수 Queue 변경의 구현 경우. 또한 append/appendleftpop/popleftdeque에있는 개체는 list 인스턴스와 마찬가지로 잘 수행되지 않습니다. __getitem__과 같은 단순한 것조차도 O(n)입니다.

+0

와우, 이미 송신자 스레드에서 대기열에있는 데이터를 변경할 수 있다는 것을 알지 못했습니다. 스레드로부터 안전합니까? – Warwick

+0

@Warwick 발신자 스레드에서 하나의 속성을 설정하고 해당 특성을 소비자로부터 읽는 한, 그렇습니다. 속성의 설정과 읽기는 모두 CPython에서는 원 자성이며, GIL 때문에 두 가지 연산을 병렬로 실행할 수있는 방법이 없습니다. 하나는 항상 다른 하나보다 먼저 시작하고 완료됩니다. – dano

관련 문제