场景:使用 peonytwitter 和 discordpy 从 twitter 流到 discord 服务器的实时更新。有时,我们需要放慢推文的速度以避免剧透(推特领先于现场广播)。
我在流循环中有一个异步推文,作为一个正在运行的任务
async def twat(bot,totrack,outputChannel):
ctx = pclient.stream.statuses.filter.post(follow=totrack)
async with ctx as stream:
async for tweet in stream:
...
global tweetdelay
await async.sleep(tweetdelay)
print("tweetdelay is set to {}".format(tweetdelay))
await bot.send_message(outputChannel,embed=em)
bot.loop.create_task(twat(bot,"123,456",Output1))
bot.loop.create_task(twat(bot,"789,1011,1213",Output2))
然后我有一个辅助函数,它应该改变已经运行的任务中的 tweetdelay 变量。
@commands.command(aliases = ["tweetdelay"])
async def matchmode(self,delay = "0"):
if delay.isdigit() == True:
delay = int(delay)
global tweetdelay
tweetdelay = delay
print(tweetdelay)
当通过命令触发 matchmode/tweetdelay 函数时,我得到
120
但是,当下一条推文发生时,我仍然得到
推文延迟设置为 0
所以我显然误解了如何在循环期间检查全局变量。
我想到的第一个选择是找出一种方法来终止循环并通过向它提供一个额外的参数来重新启动它 twat(bot,totrack,delay,outputChannel) 但这个问题是 twitter 的 420 增强了你的平静状态如果函数使用太频繁(例如微调延迟时),代码将阻止重新连接。有人可以在我应该做的正确方向上轻推我吗?