Python多线程学习笔记
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多线程学习笔记的更多相关文章
- python多线程学习笔记(超详细)
python threading 多线程 一. Threading简介 首先看下面的没有用Threading的程序 ): s += i time.sleep( ): s += i time. ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- java多线程学习笔记——详细
一.线程类 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...
- Python Click 学习笔记(转)
原文链接:Python Click 学习笔记 Click 是 Flask 的团队 pallets 开发的优秀开源项目,它为命令行工具的开发封装了大量方法,使开发者只需要专注于功能实现.恰好我最近在开发 ...
- JAVA多线程学习笔记(1)
JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...
- 0003.5-20180422-自动化第四章-python基础学习笔记--脚本
0003.5-20180422-自动化第四章-python基础学习笔记--脚本 1-shopping """ v = [ {"name": " ...
- Python Flask学习笔记之模板
Python Flask学习笔记之模板 Jinja2模板引擎 默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板.Flask提供的render_template函数把Jinja ...
- Python Flask学习笔记之Hello World
Python Flask学习笔记之Hello World 安装virtualenv,配置Flask开发环境 virtualenv 虚拟环境是Python解释器的一个私有副本,在这个环境中可以安装私有包 ...
- 多线程学习笔记九之ThreadLocal
目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...
随机推荐
- 1、C语言中的函数指针
一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...
- hibernate3整合spring2时hibernate即用注解又用配置文件情况时spring配置文件的配置写法
hibernate只用注解时,spring的配置文件的配置如下 <bean id="dataSource" class="org.apache.commons.db ...
- Java设计模式07:常用设计模式之装饰器模式(结构型模式)
1. Java之装饰器模式(Decorator Pattern) (1)概述: 装饰模式在Java种使用也很广泛,比如我们在重新定义按钮.对话框等时候,实际上已经在使用装饰模式了.在不必改变原 ...
- 学习strcat与strcpy
前几天刚有点认识了strlen和sizeof,今天又有点认识了strcpy和strcat. 在vc2010环境下 1 strcpy strcpy(p,q),p要么为数组,要么为空指针,要是为空指针操作 ...
- C语言内存管理
作用域: 1.代码块儿作用域: 注意的是:这里面{}就代表一个代码块儿,里面的东西是独立的,不可被其他地方访问的. 2.函数作用域 3.文件作用域 先提一下 在当前有一个文件,main.c 还有一个文 ...
- sysctl
/proc/sys目录下存放着大多数内核参数,并且可以在系统运行时进行更改,不过重新启动机器就会失效./etc/sysctl.conf是一个允许改变正在运行中的Linux系统的接口,它包含一些TCP/ ...
- Mac下Sublime Text Vim模式 方向键无法长按
在Mac终端输入(不是sublime text里的console),分别对应ST2.ST3: defaults ApplePressAndHoldEnabled -bool false default ...
- Python 基础【第九篇】运算
Python的运算符比较通俗和其他语言的几乎没什么区别 一.算数运算符 " + " 加法运算 >>> 1+3 4 加法运算扩展 "增强赋值操作" ...
- saltstack实战2--远程执行之返回(returner)
saltstack有3大功能:远程执行,配置管理,云管理 其中远程执行又可分解为:目标,模块,返回 这3个部分. 比如下面语句 [root@master ~]# salt '*' test.ping ...
- 从NSM到Parquet:存储结构的衍化
http://blog.csdn.net/dc_726/article/details/41777661 为了优化MapReduce及MR之前的各种工具的性能,在Hadoop内建的数据存储格式外,又涌 ...