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. [xml解析]rapidxml读取文件

    因为项目需要读取xml配置文件,在原来调查一番后,项目组使用了tinyxml. tinyxml确实简单,非常清楚的就把读取方案写出来了.但是,由于后期xml文件越来越大(2.5M,大概1w多行数据), ...

  2. JAVA白盒安全测试需要关注的API

    JAVA白盒安全测试需要关注的APIhttp://blog.csdn.net/testing_is_believing/article/details/19502167

  3. 深入理解计算机系统第二版习题解答CSAPP 2.13

    从20世纪70年代末到80年代末,Digital Equipment的VAX计算机是一种非常流行的机型.它没有布尔运算AND和OR指令,只有bis(位设置)和bic(位清除)这两种指令.两种指令的输入 ...

  4. [转载][记录]javascript生成不重复的随机数

    参考链接:javascript生成不重复的随机数 项目播放视频,是无序的,有上下两个按钮,所以需要生成1,8不重复的随机数数组,如: ,,,,,,, 然后再split一次,就是数组了. 拿来主义了

  5. IE, FF, Safari前端开发常用调试工具

    一些前端开发 IE 中的常用调试工具: Microsoft Script Debugger —— Companion.JS need to install this Companion.JS —— J ...

  6. 之前做web性能优化的一些个人心得

    一个web项目后期的维护主要在于性能方面.数据吞吐量一旦增大各种bug都出来了.那些通过硬件<数据库分表,数据库主从分离,读写分离>等的一些手段此处就不多说了.本文主要在编码方面做一个性能 ...

  7. linux+asp.net core+nginx+sql server

    Linux Disibutaion:Ubuntu 16.04.1 LTS Web Server:Nginx.Kestrel 安装.net core sudo sh -c 'echo "deb ...

  8. 牛客_剑指offer_重建二叉树,再后续遍历_递归思想_分两端

       总结:    重建二叉树:其实就是根据前序和中序重建得到二叉树,得到后续,只要输出那边设置输出顺序即可 [编程题]重建二叉树 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的 ...

  9. SAX方式解析XML文件实例

    books.XML文件: 书籍book.java实体类: public class Book { private String id; private String name; private Str ...

  10. ###STL学习--适配器

    点击查看Evernote原文. #@author: gr #@date: 2014-08-24 #@email: forgerui@gmail.com STL中的适配器. ###stl学习 |--迭代 ...