Python3 webserver communicate between threads for IRC bot

浪尽此生 提交于 2019-12-12 03:38:49

问题


I've read a lot of documentation about Threading, Queuing, Pooling etc. but still couldn't figure out how to solve my problem. Here's the situation : I built a python3 Django application that's served by cherrypy. The application is basically another IRC client. When I use the GUI to run my code the first time, an IRC bot is launched through a deamon Thread and listens to events. My problem is the following : how do I send data to that thread (and my bot), for instance to tell him to join a second channel ? When I run my code a second time, obviously a new instance of my bot is created, along with a new server connection. I need a way to communicate with my bot through GUI interaction. Right now the only way I had to make my bot react the specific things is by reading the database. Some other GUI action would change that database. Which is a bad system.

Here is the relevant code that starts my bot.

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:


The problem is, as you noticed, that you spawn a new thread/bot each time there is an upload. A possible solution would be to rewrite your code to do something like this:

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>)


来源:https://stackoverflow.com/questions/38542298/python3-webserver-communicate-between-threads-for-irc-bot

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!