비동기 코드를 만들려면 Twisted Deferreds을 described here으로 사용해야합니다. Deferreds는 비동기 코드 실행을위한 API를 제공하며, 콜백을 함수에 첨부 할 수 있으며 원자로 객체가 관리하는 Twisted 이벤트 루프에서 코드를 실행합니다.
귀하의 경우에 Deferreds를 사용할 수있는 두 가지 방법이 있습니다.
1) dostuff
핸들러가 결과에 대해 상관하지 않는 경우이 괜찮 reactor.callLater()
와 백그라운드에서 작업을 실행합니다. reactor.callLater()을 사용할 수 있습니다. 이렇게하면 doStuff
에서 값을 반환 한 후 비동기 함수가 실행됩니다.
그래서 이런 식으로 뭔가 :
from klein import run, route, Klein
from twisted.internet import defer, task, reactor
import os
app = Klein()
def logging(data):
ofile = open("file", "w")
ofile.write(data)
result = os.system("ls")
print(result)
@route('/')
def dostuff(request):
reactor.callLater(0, logging, "some data")
print("check!")
return b'Hello, world!'
run("localhost", 8080)
이 코드 이벤트의 순서는 다음입니다
, 먼저 "안녕하세요!"응답이 반환 및 최종 비동기 호출 suceeds 및 인쇄에 인쇄됩니다 "확인" 실행 결과는 os.system()
입니다.
2016-08-11 08:52:33+0200 [-] check!
2016-08-11 08:52:33+0200 [-] "127.0.0.1" - - [11/Aug/2016:06:52:32 +0000] "GET/HTTP/1.1" 200 13 "-" "curl/7.35.0"
a.py file
2) 백그라운드에서 작업을 실행하고 당신이 당신의 '로그'기능의 결과가이 객체에 콜백을 첨부 twisted.internet.task API를 사용하여 신경 경우 task.deferLater()
와 결과를 얻을. 이
@route('/')
def dostuff(request):
def the_end(result):
print("executed at the end with result: {}".format(result))
dfd = task.deferLater(reactor, 0, logging, "some data")
dfd.addCallback(the_end)
print("check!")
return b'Hello, world!'
같은 일을 당신이 당신의 핸들러를 리팩토링하기 위해 필요한이 길을 갈려면 이벤트의이 방법의 순서는 위와 동일합니다,하지만 logging
함수가 끝난 후 the_end
기능은 마지막에 실행됩니다.
2016-08-11 08:59:24+0200 [-] check!
2016-08-11 08:59:24+0200 [-] "127.0.0.1" - - [11/Aug/2016:06:59:23 +0000] "GET/HTTP/1.1" 200 13 "-" "curl/7.35.0"
a.py file
2016-08-11 08:59:24+0200 [-] executed at the end with result: some result
트위스트 클라인에 대한 지식이 대부분 http://tavendo.com/blog/post/going-asynchronous-from-flask-to-twisted-klein/에서 왔기 때문에 귀하의 응답은 저에게 큰 도움이됩니다. 나는 그것을 시도하지 않았지만 나는 그것이 옳다고 생각할 것이다. 고맙습니다. 정말 고맙습니다. – JLTChiu
업데이트로, 코드는 작동하지만 'E : 512, 4 : Module'twisted.internet.reactor '에 오류를 표시하는 pyCharm과 pylint는'callLater '멤버 (멤버가 없음)가 없습니다.하지만 문제는이 코드입니다. 완전히 잘 보입니다 (의도 한대로 작동 함). 이 문제를 해결할 수있는 방법이 있습니까? – JLTChiu
pycharm 코드 검사에서 버그가있는 것 같습니다. 플랫폼 특정 일 수 있습니까? pycharm이 이와 같은 검사를 수행 할 때, 그리고이 특정 코드와 함께 실패하는 이유를 확인해야합니다. 나 자신 pycharm을 사용하고 나는 그 스타일 경고를 정말로 신뢰하지 않는다, 그들의 많은 것은 틀린 경보 다. flake8은 Python 코드 스타일을 검사하는 더 좋은 도구입니다. IMO –