파이썬 대기열에 관해서는 의심 스럽습니다.대기열의 특정 작업이 완료되었는지 확인하는 방법은 무엇입니까?
run() 메서드가 큐를 실행하는 스레드 된 클래스를 작성했습니다.
import threading
import Queue
def AThread(threading.Thread):
def __init__(self,arg1):
self.file_resource=arg1
threading.Thread.__init__(self)
self.queue=Queue.Queue()
def __myTask(self):
self.file_resource.write()
''' Method that will access a common resource
Needs to be synchronized.
Returns a Boolean based on the outcome
'''
def run():
while True:
cmd=self.queue.get()
#cmd is actually a call to method
exec("self.__"+cmd)
self.queue.task_done()
#The problem i have here is while invoking the thread
a=AThread()
a.queue.put("myTask()")
print "Hai"
AThread (a = AThread())의 동일한 인스턴스가 다른 위치에서 대기열에 작업을로드합니다.
따라서 하단의 print 문은 위의 명령문을 통해 대기열에 추가 된 작업을 기다린 후 최종 기간 동안 대기해야하며 작업 실행 후 반환 된 값도 수신해야합니다.
이 작업을 수행하는 간단한 방법이 있습니까? 나는 이것에 관해 많은 것을 수색하고,이 코드를 친절하게 검토하고 격렬한 이야기를 제공한다.
왜 파이썬의 획득 및 해제 잠금이 클래스의 인스턴스에 없는지? 언급 된 시나리오에서 AThread의 인스턴스 a와 b는 동기화 될 필요가 없지만 획득 및 릴리스 잠금이 적용될 때 myTask는 a와 b의 두 인스턴스에 대해 동기화되어 실행됩니다.
친절하게 제안합니다.
각 스레드에 대기열이있는 이유는 무엇입니까? – RedBaron
지금 코드를 수정했습니다. b = AThread ("b.txt")를 기다리는 a = Athread ("a.txt")는 myTask 메소드 호출이 서로 다른 두 개의 파일에 있기 때문에 적절하지 않습니다. 따라서 Athread ("a.txt")는 한 번만 호출되고 myTask에 대한 다른 모든 호출은 대기열에 들어갑니다. –
많이 쓰이지는 않지만 대개 대기열은 전역이며 수행 할 작업을 보유합니다. 스레드를 보유하고있는 스레드 풀 (스레드 큐)이 있습니다. 스레드 관리자는 task queu가 비어 있지 않을 때까지 반복됩니다. - 깨어나고, task_queue에서 작업을 가져오고, 스레드 풀에서 스레드를 가져옵니다. 스레드에 작업 할당. 잠자다. 스레드 풀에 스레드가 없으면 잠자기 후 다시 시도하십시오.해당 부분의 스레드 - 결과를 실행하고 반환하면 스레드 풀에 자체가 추가됩니다. 스레드는 서로 독립적으로 작동하지만 모든 작업이 완료 될 때까지 프로그램이 종료되지 않습니다. – RedBaron