Để làm cho mã của bạn không đồng bộ, bạn cần sử dụng Twisted Deferreds làm described here. Hoãn cung cấp cho bạn một API để thực thi mã không đồng bộ, chúng cho phép bạn gắn các hàm gọi lại vào các hàm của bạn và chúng thực thi mã trong vòng lặp sự kiện xoắn được quản lý bởi đối tượng lò phản ứng.
Tôi thấy hai cách tiềm năng để sử dụng Trì hoãn trong trường hợp của bạn.
1) Thực hiện nhiệm vụ trong nền với reactor.callLater()
Đây là ok nếu dostuff
xử lý không quan tâm đến kết quả. Bạn có thể sử dụng reactor.callLater(). Bằng cách này, hàm async của bạn sẽ thực thi sau khi bạn trả về giá trị từ doStuff
.
Vì vậy, một cái gì đó như thế này:
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)
Trình tự các sự kiện với mã này đang theo, đầu tiên "kiểm tra" được in, sau đó "hello world" phản ứng được trả về và trong suceeds kết thúc cuộc gọi async và in kết quả chạy 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) Thực hiện nhiệm vụ ở chế độ nền và nhận được kết quả với task.deferLater()
Nếu bạn quan tâm đến kết quả của chức năng 'ghi' của bạn, bạn cũng có thể đính kèm callback để đối tượng này và sử dụng twisted.internet.task API. Nếu bạn muốn đi theo con đường này, bạn cần phải cấu trúc lại xử lý của bạn để làm việc như thế này
@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!'
này để cách các sự kiện sẽ tương tự như trên, nhưng the_end
chức năng sẽ được thực hiện ở cuối sau khi chức năng logging
của bạn kết thúc.
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
Vì kiến thức của tôi đối với Klein bị xoắn chủ yếu đến từ http://tavendo.com/blog/post/going-asynchronous-from-flask-to-twisted-klein/ Phản hồi của bạn giúp tôi rất nhiều. Tôi đã không thử nó nhưng tôi sẽ giả định nó là chính xác. Cảm ơn nhiều. Thực sự đánh giá cao nó. – JLTChiu
Khi cập nhật, mã hoạt động, nhưng pyCharm và pylint của tôi hiển thị lỗi trên 'E: 512, 4: Module' twisted.internet.reactor 'không có thành viên' callLater '(không có thành viên) 'nhưng vấn đề là mã này có vẻ hoàn toàn tốt (Nó hoạt động như dự định). Có cách nào để sửa lỗi này? – JLTChiu
trông giống như một số lỗi trong kiểm tra mã pycharm, có thể là một nền tảng cụ thể? Bạn sẽ phải kiểm tra những gì pycharm tìm kiếm khi thực hiện kiểm tra như thế này và tại sao nó không thành công với đoạn mã cụ thể này. Tôi sử dụng pycharm bản thân mình và tôi không thực sự tin tưởng cảnh báo phong cách của nó, nhiều người trong số họ là báo động sai. flake8 là công cụ tốt hơn để kiểm tra kiểu mã python IMO –