【问题标题】:discord & multiprocessing deadman switch python不和谐和多处理死人开关python
【发布时间】:2022-01-02 09:50:53
【问题描述】:

我试图建立这个逻辑,所以如果我收到一条包含“911”的不和谐消息,它会破坏脚本或调用一些函数并停止计时器 我面临很多错误,我想不出一个正确的方法来做到这一点......

有什么帮助吗?

from time import sleep
import discord
import multiprocessing

client = discord.Client()
manager = multiprocessing.Manager()
sign = manager.boolean(False)

def Timer(sign):
    for second in range(15):
        if sign == True:
            print("bloooock")
            break
        if sign == False:
            print("passsssss")
            sleep(1)
def discord_message(client, sign):
    @client.event
    async def on_ready():
        print('Logged on as', client)
    async def on_message(message):
        messageContent = message.content
        if len(messageContent) > 0:
            if messageContent == str("911"):
                sign = manager.bool(True)
    client.run('###')
if __name__ == '__main__':
    freeze_support()
    p1 = multiprocessing.Process(target=Timer, args=(sign,))
    p2 = multiprocessing.Process(target=discord_message, args=(client, sign,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

【问题讨论】:

    标签: python python-3.x discord discord.py


    【解决方案1】:

    当您在函数中设置变量时,它将默认为本地范围。看这个例子:

    a = 1
    def f(): a = 2
    f()
    print(a)
    

    Try it online!

    这将输出 1。

    a = 1
    def f(): print(a); a = 2
    f()
    print(a)
    

    Try it online!

    这实际上会出错,因为你在函数f 中设置了a = 2a 变成了一个局部变量,所以print(a) 出错了,因为它当时没有定义。

    要解决这个问题,请将global a 放在函数的顶部。在您的情况下,请在 def on_message 中执行 global sign ,如下所示:

    def discord_message(client, sign):
        ...
        async def on_message(message):
            global sign
            ...
    

    现在,当设置sign = manager.bool(True) 时,它不会影响Timer 正在读取的全局变量sign

    另外,我认为您还需要在async def on_message 上方添加@client.event

    【讨论】:

    • 感谢它运行良好:)
    猜你喜欢
    • 2021-10-21
    • 2022-01-26
    • 2021-10-30
    • 2021-05-27
    • 2021-07-15
    • 2021-03-29
    • 2021-07-11
    • 2021-03-25
    • 2018-08-13
    相关资源
    最近更新 更多