注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

c32's blog

每天学习一点点,每天进步一点点.

 
 
 
 
 

日志

 
 

python多线程详解  

2015-12-30 23:51:42|  分类: Python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

生成和终止线程(由于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-3, started -1235281040)> [3, 0, 6, 7, 7, 8, 6, 8, 1, 0]
<Thread(Thread-1, started -1218495632)> [6, 0, 6, 9, 1, 7, 3, 6, 1, 2]
<Thread(Thread-2, started -1226888336)> [1, 6, 6, 4, 6, 9, 7, 0, 2, 8]
<Thread(Thread-5, started -1252066448)> [6, 3, 5, 4, 6, 5, 3, 4, 2, 9]
<Thread(Thread-4, started -1243673744)> [3, 5, 7, 9, 3, 1, 4, 3, 9, 0]

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

  评论这张
 
阅读(55)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017