首页 文章

Python3 webserver在IRC bot的线程之间进行通信

提问于
浏览
0

我已经阅读了很多关于线程,排队,池等的文档,但仍然无法弄清楚如何解决我的问题 . 情况就是这样:我构建了一个由cherrypy服务的python3 Django应用程序 . 该应用程序基本上是另一个IRC客户端 . 当我第一次使用GUI运行我的代码时,IRC bot通过deamon Thread启动并监听事件 . 我的问题如下:如何将数据发送到该线程(和我的机器人),例如告诉他加入第二个 Channels ?当我第二次运行我的代码时,显然会创建一个新的bot实例,以及一个新的服务器连接 . 我需要一种通过GUI交互与我的机器人进行通信的方法 . 现在,我必须让我的机器人对特定事物作出反应的唯一方法是阅读数据库 . 其他一些GUI操作会更改该数据库 . 这是一个糟糕的系统 .

这是启动我的机器人的相关代码 .

def DCC_deamonthread(c, server, nickname, upload):
    try:
        c.connect(server, 6667, nickname)
        c.start()
    except irc.client.ServerConnectionError as x:
        log("error" + str(x)).write()
        upload.status, upload.active = "Error during connection", False
        upload.save()

def upload_file(filename, rec_nick, pw):
    global upload
    Upload_Ongoing.objects.all().delete()
    upload = Upload_Ongoing(filename=filename,status="Connecting to server...", active=True)
    upload.save()
    irc.client.ServerConnection.buffer_class.encoding = 'latin-1'
    c = DCCSend(filename, rec_nick, pw)
    server = "irc.rizon.net"
    nickname = ''.join(random.choice(string.ascii_lowercase) for i in range(10))
    t = threading.Thread(target=DCC_deamonthread, args=(c, server, nickname, upload))
    t.daemon=True
    t.start()

1 回答

  • 1

    正如您所注意到的,问题是每次上传时都会产生新的线程/机器人 . 一种可能的解决方案是重写代码以执行以下操作:

    event_queue = multiprocessing.Queue() # Events that will be sent to the IRC bot thread
    
    def irc_bot_thread():
        bot = connect_to_irc()
    
        for event in event_queue:
            bot.handle_event(event)
    
    threading.Thread(target=irc_bot_thread).start()
    
    def upload_file(filename, rec_nick, pw):
        # Django stuff
    
        event_queue.push(<necessary data for use by the bot>)
    

相关问题