【问题标题】:global not being modified correctly in async for loop全局未在异步 for 循环中正确修改
【发布时间】: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 增强如果过于频繁地使用该功能(例如微调延迟时),您的平静状态代码将阻止重新连接。有人可以帮我推动我应该做的正确方向吗?

【问题讨论】:

    标签: python-3.x twitter async-await discord


    【解决方案1】:
    async def check_delay():
        global tweetdelay
        return tweetdelay
    
    twat():
        ...
        tweetdelay = await check_delay()
        await async.sleep(tweetdelay)
    

    【讨论】:

      猜你喜欢
      • 2019-08-23
      • 2017-03-05
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 2017-05-19
      • 2016-10-26
      • 2016-04-25
      • 2015-10-02
      相关资源
      最近更新 更多