login每天学习一点点,每天进步一点点.
当前位置:首页 >> python多线程详解

python多线程详解

2015-12-30 23:51:00  |  分类: Python |  标签: 阅读(277)评论(0)

生成和终止线程(由于thread模块比较低级,不被推荐使用,所以就不说了)

1 使用threading.Thread类

使用threading模块来创建线程是很简单的。简单地说,只要继承threading.Thread,然后在__init__方法中,调用threading.Thread类的__init__方法,重写类的run方法就可以了。

	

import threading class MyThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): pass thread = MyThread() thread.start()

程序主要是创建一个继承自threading.Thread的类,然后实例化此对象,并调用相应的方法来生成线程。

这是一个简单的例子,大家可以看一下:

	

import threading import time class MyThread(threading.Thread): def __init__(self, index, create_time): threading.Thread.__init__(self) self.index = index self.create_time = create_time def run(self): time.sleep(1) print (time.time() - self.create_time), "\t", self.index print "Thread %d exit..." %(self.index) for index in range(5): thread = MyThread(index, time.time()) thread.start() print "main thread exit..."

	

main thread exit... 1.0011651516 0 Thread 0 exit... 1.00121307373 1 Thread 1 exit... 1.00119805336 2 Thread 2 exit... 1.0011780262 3 Thread 3 exit... 1.00115704536 4 Thread 4 exit...

threading中Thread类的常用方法

start          开始运行生成的线程实例  run            重载此方法,作为线程的运行部分
join            等待线程的结束
getName        返回线程的名字
setName        设置线程的名字
isAlive          查看线程是否还是活动的
isDaemon          返回线程的是否后台运行标志
setDaemon        设置线程的后台运行标志

现成的名字不但可以通过setName设置,还可以通过Thread类的__init__构造函数中设置。如果不设置线程的名字,系统将使用如Thread-N的名字

	

class MyThread(threading.Thread): def __init__(self, index, create_time, thread_name): threading.Thread.__init__(self, name = thread_name) self.index = index self.create_time = create_time

2  管理线程

在一个线程的生命周期中,会在不同的状态间切换。在任意时刻,线程总是处于某个线程状态中。一共四种状态;就绪状态/运行状态/休眠状态/终止状态

1)主线程对子线程的控制

在上面的例子中,打印信息“main thread exit...“一般出现在打印信息(如“Thread 4 exit..)之前。也就是说,在主线程生成了子线程之后 ,主线程将继续执行,而不会等待子线程的结束。但很多时候,需要等待子线程完成以后,主线程再继续执行。这可以通过join方法来实现

	

threads = [] for index in range(5): thread = MyThread(index, time.time()) thread.start() threads.append(thread) for thread in threads: thread.join() print "main thread exit... "

	

1.00116205215 0 Thread 0 exit... 1.00103282928 3 Thread 3 exit... 1.00128912926 1 Thread 1 exit... 1.00128412247 2 Thread 2 exit... 1.00122499466 4 Thread 4 exit... main thread exit...

join方法还有一个超时参数(timeout)。如果线程没有正常退出或者通过某个异常退出,且超时的情况下,主线程就不再等待子线程了。但是join只能返回None。因此当有超时参数的时候,无法判断线程是否结束。(isAlive)

使用join的时候,注意事项:
1)在超时参数不存在的情况下,join操作将会一直阻塞,知道线程终
2)一个线程可以多次使用join方法
3)线程不能在自己的运行代码中调用join方法,否则会发生死锁
4)在线程调用start之前,调用join方法会发生错误

2) 线程中的局部变量

有时候需要在每个线程中使用自己独立的变量。这时,就需要threading.local。

	

import threading  import random, time class MyThread(): def __init__(self): self.local = threading.local() def run(self): time.sleep(random.random()) self.local.number = [] for i in range(10): self.local.number.append(random.choice(range(10))) print threading.currentThread(), self.local.number threadlocal = MyThread() threads = [] for i in range(5): = threading.Thread(target = threadlocal.run) t.start() threads.append(t) for i in range(5): threads[i].join

	

<Thread(Thread-3started -1235281040)> [3, 0, 6, 7, 7, 8, 6, 8, 1, 0] <Thread(Thread-1started -1218495632)> [6, 0, 6, 9, 1, 7, 3, 6, 1, 2] <Thread(Thread-2started -1226888336)> [1, 6, 6, 4, 6, 9, 7, 0, 2, 8] <Thread(Thread-5started -1252066448)> [6, 3, 5, 4, 6, 5, 3, 4, 2, 9] <Thread(Thread-4started -1243673744)> [3, 5, 7, 9, 3, 1, 4, 3, 9, 0]

原文链接http://www.cnblogs.com/bupt/archive/2013/03/31/sh03.html











上一篇:ubuntu使用nmap查询端口 下一篇:ThinkPHP5 的视图$view->fetch()和$view->display()的区别

猜你喜欢

发表评论:

0.234155s