Có kinh nghiệm 1 ngày ở Twisted tôi cố gắng lên lịch gửi tin nhắn trả lời tcp client:Python bị xoắn: cách lên lịch?
import os, sys, time
from twisted.internet import protocol, reactor
self.scenario = [(1, "Message after 1 sec!"), (4, "This after 4 secs"), (2, "End final after 2 secs")]
for timeout, data in self.scenario:
reactor.callLater(timeout, self.sendata, data)
print "waited %d time, sent %s\n"%(timeout, data)
Bây giờ nó sẽ gửi thông điệp, nhưng tôi có 2 vấn đề:
1) "timeout" đang diễn ra từ " bây giờ ", và tôi muốn đếm nó sau mỗi nhiệm vụ trước đã được hoàn thành (tin nhắn trước đó đã được gửi)
2) Tôi không biết cách đóng kết nối sau khi tất cả các tin nhắn được gửi đi. Nếu tôi đặt self.transport.loseConnection()
sau callLater
giây nó sẽ đóng kết nối ngay lập tức.
Trong lần thử trước, tôi không sử dụng reactor.callLater
, nhưng chỉ self.transport.write()
và time.sleep(n)
trong vòng for
. Trong trường hợp này, tất cả các tin nhắn được gửi cùng nhau sau khi hết thời gian chờ ... Không phải thứ tôi muốn.
Mục đích là chờ kết nối máy khách, chờ timeout1 và gửi tin nhắn1, chờ timeout2 và gửi tin nhắn2, ... vv Sau khi thông báo cuối cùng - kết nối đóng.
Cảm ơn, bây giờ tôi hiểu tại sao "ngủ" đã không làm việc. Bạn có thể đưa ra một ví dụ với lịch trình reactor.callLater() ở cuối của reactor.callLater trước đó()? – DominiCane
Chỉ cần định nghĩa một hàm gọi là 'self.sendata (dữ liệu)' và sau đó gọi 'reactor.callLater()' cho lần gọi lại tiếp theo, và chuyển hàm đó cho 'reactor.callLater()' đầu tiên thay vì 'self.sendata ' –