如何为Hexchat创建线程安全的Python插件?

如何为Hexchat创建线程安全的Python插件?,python,plugins,thread-safety,hexchat,Python,Plugins,Thread Safety,Hexchat,我试图为Hexchat IRC客户端编写一个简单的Python插件。然而,它似乎不是线程安全的,并导致Hexchat崩溃 __module_name__ = "Demo" __module_version__ = "1.0" __module_description__ = "Demo plug-in" import hexchat from threading import Thread from time import sleep def sleep10seconds(): #

我试图为Hexchat IRC客户端编写一个简单的Python插件。然而,它似乎不是线程安全的,并导致Hexchat崩溃

__module_name__ = "Demo"
__module_version__ = "1.0"
__module_description__ = "Demo plug-in"

import hexchat
from threading import Thread
from time import sleep

def sleep10seconds():
    # In the real script, I open here an HTTP URL on the web server that is
    # running on the IRC server host to un-ban the IP address.    
    hexchat.prnt("before sleep")
    sleep(10)
    hexchat.prnt("sleep end")
    # Here I reconnect to the IRC server. If the un-ban was
    # successful, everything should be fine now. If it failed,
    # a new "Disconnect" print event happens, and the whole process
    # (disconnected_cb -> sleep10seconds) happens again.
    hexchat.command("server " + hexchat.get_info("host"))
    return

# This function is called when a "disconnected" print event was found
def disconnected_cb(word, word_eol, userdata):
    # The sleep() needs to run in a separate thread. Otherwise, the UI
    # freezes for the time of the sleep()
    myThread = Thread(target=sleep10seconds)
    myThread.start()
    return hexchat.EAT_NONE

hexchat.command("discon")
hexchat.command("server " + hexchat.get_info("host"))
hexchat.hook_print("Disconnected", disconnected_cb)
我读了一些关于线程安全的文章,但我不是一名开发人员。我想不出我需要改变什么。你能帮帮我吗?谢谢

编辑: 关于我试图实现的目标的一些附加信息: 这个插件将是一个临时的解决办法,我在这里有一个旧的和非常奇怪的安装。在分公司,我们有一台制造机器。很久以前,有人想监视这台机器。该公司使用IRC进行内部通信,他决定使用Red Hat Linux 8(是RHL,不是RHEL)设置一台机器进行监控。他编写了一个软件,从制造机器中检索错误,并将其发布到运行在同一主机上的IRC服务器的通道中

分公司通过VPN连接到我们的办公室,但分公司的互联网连接速度很慢,最近不太稳定。这导致与远程IRC服务器的连接有时会在短时间内丢失几次,并且在重新连接后,IRC服务器会暂时禁止客户端IP地址。因此,这些客户端无法监视状态。开发人员还创建了一个CGI脚本,以取消禁止打开CGI脚本URL的客户端的IP

整个IRC主机和在该主机上运行的其他软件基本上都是一个没有人愿意触摸的黑盒子。出于这个原因,Hexchat插件似乎是一个很好的客户端解决方案,直到制造机器和整个设置在明年年底之前被替换(希望如此)

当IRC服务器禁止并断开IP地址连接时,插件应通过HTTP打开CGI脚本地址以取消禁止。CGI脚本仅在您打开URL时返回“done”,但此时un ban过程尚未完成。此外,它经常失败(~50%)。这就是为什么插件应该等待10秒以确保后台进程完成,然后重新连接到服务器。如果ban仍然处于活动状态,例如,因为服务器上的后台进程失败,客户端将再次断开连接,另一个“断开连接”事件将发生,插件的整个过程将重新开始


很抱歉解释得太长,但是我在这里发现的这个旧设置太奇怪了,需要更多的文字来解释为什么我要编写这样一个Hexchat插件。然而,插件将简化一些人的生活,直到有一天我们有了一台带有专业监控解决方案的新制造机器。:-)

我怀疑你是否真的需要线程,你能改为编辑你的问题来解释你实际上想要完成什么吗?我用额外的细节增强了问题描述。好的,那么对于HTTP访问,你可以使用libsoup,它集成到HexChat的主循环中。这里有一个Lua中最有效的例子:我不确定这如何解决我的问题。打开CGI脚本的URL后,我需要等待约10秒。这就是我在线程中所做的,否则,睡眠(10)会冻结Hexchat UI。我的问题是,即使是上面的简化版本也会导致Hexchat崩溃,因为它不是线程安全的。