Python的多线程

我们在做开发的时候很多要用到多线程技术来提高效率,线程相对进程来说是“轻量级”的,操作系统用较少的资源创建和管理线程。程序中的线程在相同的内存空间中执行,并共享许多相同的资源。

在Python中可以通过threading库来开启一个线程,你需要创建一个类并继承threading.Thread,然后在__init__里首先调用threading.Thread的__init__方法即可。

import threading
class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

上面的代码创建了一个空的线程,它没有任何的工作,但在实际开发中我们不可能去创建空的线程来浪费资源。我们需要它为我们完成一定的工作,所以我们需要重写类的run()方法,将线程要做的工作写入进去。

import threading,time
class MyThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
    def run(self):
        for i in xrange(10):
            print self.getName,i
            time.sleep(1)

以上代码如果被执行之后会每隔1秒输出一次信息到屏幕,10次后结束。其中这里getName()是threading.Thread类的一个方法,用来获得这个线程对象的名称。还有一个方法setName()当然就是来设置这个线程对象的名称。

如果要创建一个线程,首先就要先创建一个线程对象。

my = MyThread('test')

一个线程创建成功后,只是出于“born”状态,还需要让它运行起来,调用线程对象的start()方法就可以让它运行。

import threading,time
class MyThread(threading.Thread):
    def __init__(self,threadname):
        threading.Thread.__init__(self,name=threadname)
 
    def run(self):
        for i in xrange(10):
            print self.getName(),i
            time.sleep(1)
 
my = MyThread('test')
my.start()

这时候线程就处于“ready”状态(也成为“runnable”状态)。

其实我们的计算机一般是不具有真正并行处理能力的。我们所谓的多线程只是把时间分成片段,然后隔一个时间段就让一个线程执行一下,然后进入“sleeping ”状态,然后唤醒另一个在“sleeping”的线程,如此循环runnable->sleeping->runnable… ,只是因为计算机执行速度很快,而时间片段间隔很小,我们感受不到,以为是同时进行的。所以说一个线程在start了之后只是处在了可以运行的状态,它什么时候运行还是由系统来进行调度的。

在线程运行结束后,状态就变成了“dead”状态。一般来说当线程对象的run方法执行结束或者在执行中抛出异常的话,那么这个线程就会结束了。系统会自动对“dead”状态线程进行清理。

如果一个线程A在执行的过程中需要等待另一个线程B执行结束后才能运行的话,那就可以在A调用B的B.join()方法,另外还可以给join()传入等待的时间。

线程对象的setDaemon()方法可以让子线程随着主线程的退出而结束,不过注意的是setDaemon()方法必须在线程对象没有调用start()方法之前调用(默认情况下;在python中,主线程结束后,会默认等待子线程结束后,主线程才退出)。

threading还有很多功能,可以查看相关文档资料。

发表评论

电子邮件地址不会被公开。 必填项已用*标注