Sockets 用python快速执行线程(套接字侦听)
我正在用套接字制作一个应用程序,用python进行监听。我已经用canonical(它使用glade和gi.repository来制作gui)快速使用了它。但我无论如何都不能创建线程监听函数。我已经尝试了很多方法,甚至包括线程类和线程。线程类。 我不太熟悉快速和全面的线程。 我尝试了互联网上的一切:-)但找不到任何解决方案。当我使用thread.start()时,它会等待gui关闭。当我使用thread.run()时,它会退出gui并立即运行使gui没有响应的函数。下面是我用于thread类的示例代码。我可以上传整个文件,如果需要,因为这是一个开源项目。请帮帮我Sockets 用python快速执行线程(套接字侦听),sockets,python-2.7,python-multithreading,canonical-quickly,Sockets,Python 2.7,Python Multithreading,Canonical Quickly,我正在用套接字制作一个应用程序,用python进行监听。我已经用canonical(它使用glade和gi.repository来制作gui)快速使用了它。但我无论如何都不能创建线程监听函数。我已经尝试了很多方法,甚至包括线程类和线程。线程类。 我不太熟悉快速和全面的线程。 我尝试了互联网上的一切:-)但找不到任何解决方案。当我使用thread.start()时,它会等待gui关闭。当我使用thread.run()时,它会退出gui并立即运行使gui没有响应的函数。下面是我用于thread类的示
def listen(self):
print "working"
#listen to any incoming connections
#self.control_sock_in.listen(1)
i=0
while True:
print "it works"
#conn,addr = self.control_sock_in.accept()
#data = conn.recv
#if there is any incoming connection then check for free slot and reply with that free slot
#if change of status message then update nodelist
def on_btn_create_n_clicked(self, widget):
self.btn_quit_n.set_sensitive(True)
self.btn_join_n.set_sensitive(False)
self.btn_create_n.set_sensitive(False)
subprocess.check_call(["sudo", "ifconfig", "wlan0", "192.168.0.5", "netmask", "255.255.255.0", "broadcast", "192.168.0.255"])
self.control_sock_in = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.control_sock_in.bind(('192.168.0.5', 6000))
self.status_lbl.set_text("Created the network successfully with IP of 192.168.0.5!")
self.nodelist['192.168.0.5'] = ('6000','0')
#start thread on listen()
thread.start_new_thread(self.listen,(self,))
self.btn_camera.set_sensitive(True)
self.btn_mixer.set_sensitive(True)
self.btn_display.set_sensitive(True)
顺便说一句,不需要为注释项提供缺少的代码。我能做到。我遇到的是线程问题。你可以很容易地做到这一点
from threading import Thread
listener_thread = Thread(target=self.listen)
listener_thread.start()
当程序终止并且有一些非守护进程线程正在运行时,它将等待它们全部完成
您可以将线程标记为,但是您需要小心使用它们-有关更多详细信息,请参阅。基本上,它们可能仍在运行并使用处于一致状态的数据,因为其他线程中正在进行或已经进行了清理
创建守护进程线程:
from threading import Thread
listener_thread = Thread(target=self.listen)
listener_thread.daemon = True
# or listener_thread.setDaemon(True) for old versions of python
listener_thread.start()
最好的选择是将侦听器线程保留为非守护进程(默认),并考虑在程序即将退出时以某种方式通知侦听器线程。因此,您的侦听器线程可以优雅地完成
已更新
不要使用线程对象的
run
方法-它只调用您在当前调用它的线程中指定的函数。调用start
方法thread
对象在单独的线程中激发您的活动。我在这里找到了解决方案。
必须在开头加上这两行
从gi.repository导入GObject,Gtk
GObject.threads_init()
无论如何,非常感谢IRC频道的迈克尔·霍尔为我指出了这个问题。谢谢你的回答。但问题依然存在。函数“listen”仅在GUI关闭时执行。但与非执事线程不同,这会在一段时间后停止。但是我希望两个线程同时执行。你能描述一下你的程序到底是做什么的吗?这听起来很让我惊讶,它不起作用。即使是您提供的代码也应该可以工作(但我认为您应该将作为线程入口点传递的函数更改为其入站版本-
thread.start\u new\u thread(ClassName.listen,(self),)
您提供的代码没有问题。它实际上是“快速”中的一个循环孔。它使用gi.builder对象从glade文件加载gui。第二个线程在调用gui之前不会启动。我想线程应该在加载gui时被调用和初始化。但它是一个单独的类,不能从那里调用它。