Python3 网络服务器在 IRC 机器人的线程之间通信
Python3 webserver communicate between threads for IRC bot
我已经阅读了很多关于线程、队列、池等的文档,但仍然无法弄清楚如何解决我的问题。
这是情况:
我构建了一个由 cherrypy 提供服务的 python3 Django 应用程序。该应用程序基本上是另一个 IRC 客户端。当我第一次使用 GUI 运行 我的代码时,一个 IRC 机器人通过守护线程启动并监听事件。我的问题如下:如何将数据发送到该线程(和我的机器人),例如告诉他加入第二个频道?当我第二次 运行 我的代码时,显然会创建一个新的机器人实例以及一个新的服务器连接。我需要一种通过 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()
正如您所注意到的,问题是每次上传时都会产生一个新的 thread/bot。一个可能的解决方案是重写您的代码以执行如下操作:
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>)
我已经阅读了很多关于线程、队列、池等的文档,但仍然无法弄清楚如何解决我的问题。 这是情况: 我构建了一个由 cherrypy 提供服务的 python3 Django 应用程序。该应用程序基本上是另一个 IRC 客户端。当我第一次使用 GUI 运行 我的代码时,一个 IRC 机器人通过守护线程启动并监听事件。我的问题如下:如何将数据发送到该线程(和我的机器人),例如告诉他加入第二个频道?当我第二次 运行 我的代码时,显然会创建一个新的机器人实例以及一个新的服务器连接。我需要一种通过 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()
正如您所注意到的,问题是每次上传时都会产生一个新的 thread/bot。一个可能的解决方案是重写您的代码以执行如下操作:
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>)