全局未在异步 for 循环中正确修改

Posted

技术标签:

【中文标题】全局未在异步 for 循环中正确修改【英文标题】:global not being modified correctly in async for loop 【发布时间】:2017-06-03 06:38:44 【问题描述】:

场景:使用 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

但是,当下一条推文发生时,我仍然得到

tweetdelay 设置为 0

所以我显然误解了如何在循环期间检查全局变量。

我想到的第一个选择是找出一种方法来终止循环并通过向它提供一个额外的参数来重新启动它 twat(bot,totrack,delay,outputChannel) 但这个问题是 twitter 的 420 增强如果过于频繁地使用该功能(例如微调延迟时),您的平静状态代码将阻止重新连接。有人可以帮我推动我应该做的正确方向吗?

【问题讨论】:

【参考方案1】:
async def check_delay():
    global tweetdelay
    return tweetdelay

twat():
    ...
    tweetdelay = await check_delay()
    await async.sleep(tweetdelay)

【讨论】:

以上是关于全局未在异步 for 循环中正确修改的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Run for Anthos(Knative)未在 https 请求上正确设置 X-Forwarded-Proto 标头

如何正确遍历删除List中的元素(普通for循环增强for循环迭代器iteratorremoveIf+方法引用)

如何正确调用 Parallel.ForEach 循环中的调用异步方法[重复]

在nodejs(异步)中寻找循环和回调的正确模式

Javascript 中 For 循环的正确代码?

Bootstrap-Vue 分页未在屏幕上显示更新的切片数组内容