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

时间:2017-01-18 18:35:09

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

场景:使用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&#39 ; s 420增强您的平静状态代码将阻止重新连接如果太频繁使用该功能(例如,微调延迟时)。有人可以给我一个关于我应该做的正确方向的推动吗?

1 个答案:

答案 0 :(得分:0)

async def check_delay():
    global tweetdelay
    return tweetdelay

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