Python中与多线程相关的模块有 thread, threading 和 Queue等,thread 和threading模块允许程序员创建和管理线程。thread模块提供了基本的线程和锁的支持,而threading提供了更高级别,功能更强的线程管理的功能。Queue 模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构。一般不建议用thread模块。

1.threading模块

threading 模块对象函数       描述
Thread           表示一个线程的执行的对象
Lock             锁原语对象(跟 thread 模块里的锁对象相同)
RLock             可重入锁对象。使单线程可以再次获得已经获得了的锁(递归锁定)。
Condition           条件变量对象能让一个线程停下来,等待其它线程满足了某个“条件”。如,状态的改变或值的改变。
Event             通用的条件变量。多个线程可以等待某个事件的发生,在事件发生后,所有的线程都会被激活。
Semaphore           为等待锁的线程提供一个类似“等候室”的结构
BoundedSemaphore 与 Semaphore 类似,只是它不允许超过初始值

Timer与 Thread 相似,只是,它要等待一段时间后才开始运行。

threading 模块的其他函数
函数         描述
activeCount()     当前活动的线程对象的数量
currentThread()    返回当前线程对象
enumerate()     返回当前活动线程的列表
settrace(func)     为所有线程设置一个跟踪函数
setprofile(func)  a为所有线程设置一个 profile 函数

Thread 对象的函数
函数         描述
start()         开始线程的执行
run()         定义线程的功能的函数(一般会被子类重写)
join(timeout=None)   程序挂起,直到线程结束;如果给了 timeout,则最多阻塞 timeout 秒
getName()       返回线程的名字
setName(name)     设置线程的名字
isAlive()         布尔标志,表示这个线程是否还在运行中
isDaemon()       返回线程的 daemon 标志
setDaemon(daemonic)  把线程的 daemon 标志设为 daemonic(一定要在调用 start()函数前调用)

import threading
from time import sleep,ctime
def loop1():
print "loop1 start at",ctime()
sleep(4)
print "loop1 end at",ctime()
def loop2():
print "loop2 start at",ctime()
sleep(6)
print "loop2 end at ",ctime()
t1=threading.Thread(target=loop1)
t2=threading.Thread(target=loop2)
t1.start()
t2.start()

输出结果:

2.通过Lock实现线程同步

#encoding=utf-8
import threading
from time import sleep,ctime
mylock=threading.RLock() # 实例化一个RLock对象,注意L是大写的
left=10
def loop1(tid):
global left
while 1:
mylock.acquire()
if left>0:
sleep(1)
left=left-1
print str(left)+" tickets left i am thread"+str(tid)
mylock.release() t1=threading.Thread(target=loop1,args=(""))
t2=threading.Thread(target=loop1,args=(""))
t3=threading.Thread(target=loop1,args=(""))
t1.start()
t2.start()
t3.start()

3.继承thead.Tread类实现多线程

#encoding=utf-8
import threading
from time import sleep,ctime
mylock=threading.RLock() # 实例化一个RLock对象,注意L是大写的
left=10
class MyThread(threading.Thread):
def __init__(self,tid):
threading.Thread.__init__(self)
self.tid=tid
def run(self):
global left
while 1:
mylock.acquire()
if left>0:
sleep(1)
left=left-1
print str(left)+" tickets left i am thread"+str(self.tid)
mylock.release() t1=MyThread("")
t2=MyThread("")
t3=MyThread("")
t1.start()
t2.start()
t3.start()

4.Queue模块

函数               描述
Queue 模块函数
queue(size)           创建一个大小为 size 的 Queue 对象

Queue 对象函数
qsize()             返回队列的大小(由于在返回的时候,队列可能会被其它线程修改,所以这个值是近似值)
empty()             如果队列为空返回 True,否则返回 False
full()               如果队列已满返回 True,否则返回 False
put(item,block=0)        把 item 放到队列中,如果给了 block(不为 0),函数会一直阻塞到队列中有空间为止
get(block=0)           从队列中取一个对象,如果给了 block(不为 0),函数会一直阻塞到队列中有对象为止

#encoding=utf-8
import threading
import random
from time import sleep,ctime
from Queue import Queue
myQueue=Queue()
class Product(threading.Thread):
def __init__(self,queue):
threading.Thread.__init__(self)
self.queue=queue
def run(self):
itemID=1
for i in range(10):
sleep(2)
self.queue.put("item"+str(itemID))
print "product item",itemID
itemID=itemID+1
class Consume(threading.Thread):
def __init__(self,queue):
threading.Thread.__init__(self)
self.queue=queue
def run(self):
itemID=1
while 1: sleep(random.random()*5)
if not self.queue.empty():
item=self.queue.get()
print "consume ",item
else:
print "DONE"
break productT=Product(myQueue)
consumeT=Consume(myQueue)
productT.start()
consumeT.start()

5.使用Queue实现多线程数量控制

#encoding=utf-8
__author__ = 'kevinlu1010@qq.com'
import threading
from time import sleep
from Queue import Queue
q=Queue(5) def f(num):
print num
sleep(1)
q.get()
for i in range(10):
q.put(1,block=1)
p=threading.Thread(target=f,args=[i])
p.start()

这里主要应用了Queue put时可以阻塞的特性来实现线程数的控制

6.高级版:利用线程池和map实现多线程

#encoding=utf-8
__author__ = 'kevinlu1010@qq.com'
from time import sleep
from multiprocessing.dummy import Pool as ThreadPool pool =ThreadPool(4) #线程池的大小,总并发数
def f(a):
print 'hello%s'%str(a)
sleep(1) b=pool.map(f,range(10))
# pool.close()
# pool.join()
print 'hello last'

用到了 multiprocessing 里面的 Pool类,实现起来非常方便,而且效率很高。

参考:http://www.oschina.net/translate/python-parallelism-in-one-line

Python多线程学习笔记的更多相关文章

  1. python多线程学习笔记(超详细)

    python threading 多线程 一. Threading简介 首先看下面的没有用Threading的程序 ):  s += i  time.sleep(  ):  s += i  time. ...

  2. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  3. java多线程学习笔记——详细

    一.线程类  1.新建状态(New):新创建了一个线程对象.        2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...

  4. Python Click 学习笔记(转)

    原文链接:Python Click 学习笔记 Click 是 Flask 的团队 pallets 开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现.恰好我最近在开发 ...

  5. JAVA多线程学习笔记(1)

    JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...

  6. 0003.5-20180422-自动化第四章-python基础学习笔记--脚本

    0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...

  7. Python Flask学习笔记之模板

    Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...

  8. Python Flask学习笔记之Hello World

    Python Flask学习笔记之Hello World 安装virtualenv,配置Flask开发环境 virtualenv 虚拟环境是Python解释器的一个私有副本,在这个环境中可以安装私有包 ...

  9. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

随机推荐

  1. [016]转--C++拷贝构造函数详解

    一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员 ...

  2. 文件I/O之/dev/fd

    较新的系统都提供名为/dev/fd的目录,其目录项是名为0.1.2等的文件.打开文件/dev/fd/n等效于复制描述符n(假定描述符n是打开的). 在下列函数调用中: fd = open( " ...

  3. iOS 8创建交互式通知

    iOS 8提供了一个令人兴奋的新API来创建交互式通知(interactive notifications),它能让你在你的应用之外为用户提供额外的功能.我发现网上还没有关于如何实现它的比较好的示例教 ...

  4. SQL SERVER 2005 同步复制

    what SQL SERVER2005复制是在不同数据库间保持数据结构和数据内容同步更新的一种方案. 由三部分构成: 发布服务器:包含了需要被发布的数据库,也就是需要向其它数据源分发内容的源数据库. ...

  5. Maven学习小结(三 基本概念)

    1.Maven POM POM(Project Object Model)项目对象模型,是用Maven来管理项目里的一个叫做pom.xml的文件.所有的项目配置信息都被定义在这个文件中, 通过这个文件 ...

  6. Java基础知识强化之网络编程笔记19:Android网络通信之 HttpClient和传统Post、Get方式的区别

    1. HttpClient是什么 ?     HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 ...

  7. JSON数据理解

    话说JSON数据平常用的确实挺多的,但是基本上只知道怎么用,对其一些细节并没有整理过,今儿趁着下午有点空,坐下来,学习整理下,并分享出来. 对于JSON,首先它只是一种数据格式,并非一种语言,虽然和j ...

  8. jQuery-对Select的操作

    语法解释: $("#select_id").change(function(){//code...}); //为Select添加事件,当选择其中一项时触发 var checkTex ...

  9. RabbitMQ 原文译04--路由

    在前一篇文章中我们构建了一个简单的日志系统,我们可以向多个接受者广播消息. 在这篇文章我,我们将要添加一些功能使得针对部分消息的接受成为可能,例如我们只对错误的消息进行磁盘记录,同时又可以把所有的消息 ...

  10. 使用WCF和WEBService出现配置的问题

    错误代码:system.serviceModel/bindings/customBinding 处的绑定没有名称为"SMSServiceServiceSoapBinding"的已配 ...