在多线程编程的时候如何让子线程退出


类型: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/。


暂时还没有任何评论。


何不来发表一下您对本文的看法(使用Markdown语法,分段空两行):