类型:Python,创建时间:Dec. 31, 2011, 1:48 a.m.
标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/20/。
虽然python下推荐使用多进程编程,但是在一些场合下,多线程编程还是方便一些。
最近就经常写一些关于网络方面的命令小程序,一个线程不断地从命令行得到用户的输入并且向网络发送一些东西,另外一个线程则从网络接收数据并打印在屏幕上。平常结束一个程序的办法是调用exit()
函数,不过对于多线程的网络程序似乎却有点难办,因为除了一条sys.exit()
语句外,还需要结束从网络接收数据的后台线程。
不幸的是python没有提供结束线程的接口,不能像java或者c#那样,使用thread.interrupt()
就可以让线程结束。更糟糕的是,python调用系统函数的时候会被阻塞在内核,除非阻塞被解除,这个线程不再继续执行python解释器的代码了,所以interrupt()
理论上根本无法实现。那要怎么退出线程呢?我的解决办法是这样的:
class Demo: def __init__(self): self.exiting=False self.t=threading.Thread(target=self.func) self.t.start() def func(self): s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(("", 1234)) while not self.exiting: try: d=s.recv(1024) pass #do someting instead except: #catch all exceptions pass def exit(self): self.exiting=True s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.sendto("exit", 0, ("127.0.0.1", 1234)) self.t.join()
基本原理是设置一个名为exiting
的全局变量,从网络读数据的线程以它为循环条件。如果要让这个线程退出,只需要改变一下exiting
的值,接着发送一些信息让线程退出阻塞。 调用线程的join
函数可以等待线程退出。
标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/20/。
暂时还没有任何评论。