gpt4 book ai didi

Python 扭曲 : how to schedule?

转载 作者:太空狗 更新时间:2023-10-29 22:14:21 30 4
gpt4 key购买 nike

在 Twisted 中有 1 天的经验,我尝试安排消息发送以回复 tcp 客户端:

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)

现在它发送消息了,但是我有两个问题:
1)“超时”是从“现在”开始的,我想在每个之前的任务完成后(发送之前的消息)
2) 发送完所有消息后,我不知道如何关闭连接。如果我将 self.transport.loseConnection() 放在 callLater 之后,它会立即关闭连接。

在之前的尝试中,我没有使用 reactor.callLater,而只使用了 self.transport.write()time.sleep(n) for 循环中的。在这种情况下,所有消息都在所有超时后一起发送……这不是我想要的。
目的是等待客户端连接,等待超时 1 并发送消息 1,等待超时 2 并发送消息 2,...等。最后一条消息后 - 关闭连接。

最佳答案

在使用 Twisted 时要意识到的重要一点是没有什么可以等待。当您调用 reactor.callLater() 时,您是在要求 react 堆稍后调用某些东西,而不是现在。调用立即完成(在调用被安排之后,之前它被执行。)因此,你的 print 语句是一个谎言:你没有等待 超时时间;你根本就没有等。

您可以通过多种方式修复它,使用哪种方式取决于您的实际需要。如果您希望第二个任务在第一个任务开始后四秒开始,您可以简单地将第一个任务的延迟(您的timeout变量)添加到第二个任务。但是,第一个任务可能不会在您安排的时候准确开始;它可能会稍后开始,如果 Twisted 太忙而无法早点开始。此外,如果您的任务需要很长时间,则可能在第二个任务开始之前实际上并未完成。

更常见的方式是第一个任务调度第二个任务,而不是马上调度第二个任务。您可以在第一个任务结束后四秒安排它(通过在第一个任务结束时调用 reactor.callLater()),或者在第一个任务开始后四秒(通过调用 reactor .callLater() 在第一个任务的开始),或者执行更复杂的计算来确定它应该何时开始,跟踪耗时。

当您在 Twisted 等待中什么都没有意识到时,在您执行完所有计划任务后处理关闭连接变得很容易:您只需让最后一个任务调用 self.transport.loseConnection()。对于更复杂的情况,您可能希望将 Deferred 链接在一起,或者使用 DeferredList 在所有未决任务完成时执行 loseConnection() ,即使它们不是严格连续的。

关于Python 扭曲 : how to schedule?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3302185/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com