अपना कोड एसिंक बनाने के लिए आपको Twisted Deferredsdescribed here के रूप में उपयोग करने की आवश्यकता है। डिफर्ड आपको एसिंक्रोनस कोड निष्पादन के लिए एक एपीआई देते हैं, वे आपको अपने कार्यों में कॉलबैक संलग्न करने की अनुमति देते हैं और वे रिएक्टर ऑब्जेक्ट द्वारा प्रबंधित ट्विस्टेड इवेंट लूप में कोड निष्पादित करते हैं।
मुझे आपके मामले में डिफर्रेड का उपयोग करने के दो संभावित तरीके दिखाई देते हैं।
1) reactor.callLater()
साथ पृष्ठभूमि में कार्य निष्पादित यह ठीक है अगर dostuff
हैंडलर परिणाम के बारे में परवाह नहीं है। आप reactor.callLater() का उपयोग कर सकते हैं। doStuff
से मूल्य वापस करने के बाद इस तरह आपका async फ़ंक्शन निष्पादित होगा।
तो कुछ इस तरह:
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)
इस कोड के साथ ईवेंट के क्रम में पीछा कर रहा है, पहले "जाँच" छपा है, फिर "हैलो दुनिया" प्रतिसाद दिया और अंत async कॉल 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) पृष्ठभूमि में कार्य निष्पादित और task.deferLater()
साथ परिणाम प्राप्त आप अपने 'प्रवेश' समारोह के परिणाम आप भी इस वस्तु को कॉलबैक देते हैं और twisted.internet.task एपीआई का उपयोग कर सकते हैं के बारे में परवाह है। आप इस
@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!'
की तरह काम करने के लिए इस तरह से आप अपने हैंडलर refactor करने के लिए की जरूरत जाना चाहते हैं घटनाओं के इस तरह से क्रम से ऊपर के रूप में ही होगा, लेकिन अपने 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
एक अद्यतन के रूप में, कोड काम करता है, लेकिन मेरा पाइचर्म और पिलिंट 'ई: 512, 4: मॉड्यूल' twisted.internet.reactor 'पर त्रुटियों को दिखा रहा है' कोई 'कॉललेटर' सदस्य नहीं है (कोई सदस्य नहीं है) लेकिन समस्या यह कोड है पूरी तरह से ठीक लगता है (यह इरादे के रूप में काम करता है)। क्या इसे ठीक करने का कोई तरीका है? – JLTChiu
पिचर्म कोड निरीक्षण में कुछ बग की तरह दिखता है, कुछ प्लेटफार्म विशिष्ट हो सकता है? आपको यह जांचना होगा कि इस तरह की जांच करते समय क्या पिचर्म दिखता है और यह कोड के इस विशिष्ट टुकड़े में क्यों विफल रहता है। मैं खुद को पिचर्म का उपयोग करता हूं और मैं वास्तव में इसकी स्टाइल चेतावनियों पर भरोसा नहीं करता हूं, उनमें से कई झूठे अलार्म हैं। flake8 पायथन कोड शैली की जांच के लिए बेहतर उपकरण है IMO –