다음 코드에 문제가 있습니다. 내 실제 상황에서 SomeClass로 캡슐화 된 로직은 로직을 차단하므로 reactor.callFromThread()
으로 호출해야합니다. SomeClass.run()의 루프를 sigint 시그널을 발생 시키면 멈추고 싶다. 나의 이해는 addSystemEvent 훅에서 이것을하기위한 코드를 넣는 것이 이것을 처리해야한다는 것이다. 필자는 이것이 Twisted 자체보다는 파이썬에 대한 이해와 스레딩에 더 많은 문제가 될 것이라고 생각합니다.Twisted에서 스레드를 어떻게 중단합니까?
from twisted.internet import reactor
import time
class SomeClass():
def __init__(self):
self.running = False
def run(self):
self.running = True
while(self.running):
print('foo')
time.sleep(5)
def stop(self):
print('stopping')
self.running = False
someClassInstance = SomeClass()
def cleanup():
someClassInstance.stop()
reactor.addSystemEventTrigger('before', 'shutdown', cleanup)
reactor.callFromThread(someClassInstance.run)
reactor.run()
본질적으로 동기식 IMAP 클라이언트 작업을 수행하는 일부 레거시 라이브러리를 호출하여 네트워크 호출을 차단하고 있습니다. 지금은'callFromThread()'대신'callInThread()'를 사용하여 작업하고 있지만, 더 정확한 Twisted 방식으로 내 블로킹 코드를 샌드하는 방법을 알고 싶습니다. 편집 : 나는'deferToThread()'로 더 좋게 보일 수 있다는 것을 깨달았지만 여전히 스레드를 사용하고 있습니다! – Cera