之前提了Python多线程的一点使用,今天介绍更好的threading模块,它提供了Thread类和一些比较好用的同步机制。

先介绍Thread类

threading模块中的Thread类有很多thread模块里没有的方法,一般使用时可以选择几种方法里的一种:

  • 创建一个Thread实例,传给它一个函数;
  • 创建一个Thread实例,传给它一个可调用的类对象;
  • 从Thread派生一个子类,创建这个子类的实例。

可以看看它有哪些方法

函数 描述
start() 开始线程的执行

run()

定义线程的功能的函数(一般会被子类重写)
join(timeout=None) 程序挂起,知道线程结束,如果给了timeout,最多阻塞timeout秒

getName()

返回线程的名字
setName(name) 设置线程的名字
isAlive() 布尔标志,表示这个线程是否还在运行中
isDaemon() 返回线程的daemon标志
setDaemon(daemonic) 把线程的daemon标志设置成daemonic

用threading模块重写我们上次的例子:

import threading
from time import sleep, ctime loops = [4, 2] def loop(nloop, nsec):
print 'start loop%s at: %s\n' % (nloop, ctime()),
sleep(nsec)
print 'loop%s done at: %s\n' % (nloop, ctime()), def main():
print 'starting at: %s\n' % ctime(),
threads = []
nloops = range(len(loops)) for i in nloops:
t = threading.Thread(target = loop,
args=(i,loops[i]))
threads.append(t) for i in nloops:
threads[i].start() for i in nloops:
threads[i].join()
print 'all DONE at: %s\n' %ctime(), if __name__ == '__main__':
main()

结果也是如下显示:

>>>
starting at: Sun Jan 03 11:37:43 2016
start loop0 at: Sun Jan 03 11:37:43 2016
start loop1 at: Sun Jan 03 11:37:43 2016
loop1 done at: Sun Jan 03 11:37:45 2016
loop0 done at: Sun Jan 03 11:37:47 2016
all DONE at: Sun Jan 03 11:37:47 2016

比起昨天的锁,这里只需要简单地对每个线程使用join()函数就可以了。

join()看上去会比一个等待锁释放的无限循环清楚一些。它另一个很重要的方面是可以完全不用调用,一旦线程启动后就会一直执行,知道线程的函数结束退出位置。

上面使用的是一种传递函数给Thread模块,也可以在创建线程的时候,传一个可调用的类的实例来供线程启动的时候执行,这是一种更面为对象的方法。

代码如下:

import threading
from time import sleep, ctime loops = [4, 2] class ThreadFunc(object):
def __init__(self, func, args, name=''):
self.name = name
self.func = func
self.args = args def __call__(self):
self.res = self.func(*self.args) def loop(nloop, nsec):
print 'start loop %s at: %s\n' %(nloop, ctime()),
sleep(nsec)
print 'loop %s done at: %s\n' %(nloop, ctime()), def main():
print 'starting at:', ctime()
threads = []
nloops = range(len(loops)) for i in nloops:
t = threading.Thread(
target = ThreadFunc(loop, (i,loops[i]),
loop.__name__))
threads.append(t) for i in nloops:
threads[i].start() for i in nloops:
threads[i].join() print 'all DONE at:', ctime() if __name__ == '__main__':
main()

结果和上面是一样的,这里就不贴了。

可以看到我们怎家了一个ThreadFunc类和创建Thread对象时实例化一个可调用类ThreadFunc的类对象。

创建线程时,Thread对象会调用我们的ThreadFunc对象,会用到一个特殊函数__call__(),由于我们已经有了要用的参数,所以不再传到Thread()构造器中。

最后一种方法是从Thread类中派生一个子类,然后创造这个子类的实例。

import threading
from time import sleep, ctime loops = [2, 4] class MyThread(threading.Thread):
def __init__(self, func, args, name=''):
threading.Thread.__init__(self)
self.name = name
self.func = func
self.args = args def run(self):
apply(self.func, self.args) def loop(nloop, nsec):
print 'start loop%s at: %s' %(nloop, ctime())
sleep(nsec)
print 'loop%s done at:%s' %(nloop, ctime()) def main():
print 'starting at:%s' % ctime()
threads = []
nloops = range(len(loops)) for i in nloops:
t = MyThread(loop, (i, loops[i]),
loop.__name__)
threads.append(t) for i in nloops:
threads[i].start() for i in nloops:
threads[i].join() print 'all DONE at: %s' % ctime() if __name__ == '__main__':
main()

2016/1/3 Python中的多线程(2):threading模块的更多相关文章

  1. 2016/1/2 Python中的多线程(1):线程初探

    ---恢复内容开始--- 新年第一篇,继续Python. 先来简单介绍线程和进程. 计算机刚开始发展的时候,程序都是从头到尾独占式地使用所有的内存和硬件资源,每个计算机只能同时跑一个程序.后来引进了一 ...

  2. python中的多线程【转】

    转载自: http://c4fun.cn/blog/2014/05/06/python-threading/ python中关于多线程的操作可以使用thread和threading模块来实现,其中th ...

  3. python中的多线程

    一个程序可以理解为一个进程,这个进程有其代号,可以依据这个代号将其杀死. 一个进程肯定有且只有一个主线程,他可以有很多子线程. 运行一个任务如果可以有许多子线程同时去做,当然会提高效率. 但是,在py ...

  4. Python中的多线程编程,线程安全与锁(二)

    在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...

  5. python中的多线程和多进程

    一.简单理解一下线程和进程 一个进程中可有多个线程,线程之间可共享内存,进程间却是相互独立的.打比方就是,进程是火车,线程是火车厢,车厢内人员可以流动(数据共享) 二.python中的多线程和多进程 ...

  6. Python中的multiprocessing和threading

    Python中的multiprocessing和threading分别使用来实现多进程编程和多线程编程的.其中threading比较简单,而前者比较繁琐. 下面,我们进行一下分析: 多线程--thre ...

  7. Python中操作mysql的pymysql模块详解

    Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...

  8. python中的计时器:timeit模块

    python中的计时器:timeit模块 (1) timeit - 通常在一段程序的前后都用上time.time()然后进行相减就可以得到一段程序的运行时间,不过python提供了更强大的计时库:ti ...

  9. Python中的多线程编程,线程安全与锁(一)

    1. 多线程编程与线程安全相关重要概念 在我的上篇博文 聊聊Python中的GIL 中,我们熟悉了几个特别重要的概念:GIL,线程,进程, 线程安全,原子操作. 以下是简单回顾,详细介绍请直接看聊聊P ...

随机推荐

  1. salt-api使用

    salt-api 基本使用 目前salt API 支持的web模块如下: CherryPy Tornado WSGI 1.安装salt-api salt 使用 CherryPy来实现restful的a ...

  2. 团队作业7——第二次项目冲刺(Beta版本12.07——12.08)

    1.当天站立式会议照片 本次会议在5号公寓3楼召开,本次会议内容:①:熟悉每个人想做的模块.②:根据项目要求还没做的完成. 2.每个人的工作 经过会议讨论后确定了每个人的分工 组员 任务 陈福鹏 实现 ...

  3. 西门子S7系列PLC的主要种类及应用软件

    德国西门子(SIEMENS)公司生产的可编程序控制器在我国的应用也相当广泛,在冶金.化工.印刷生产线等领域都有应用.西门子(SIEMENS)公司的PLC产品包括LOGO,S7-200,S7-300,S ...

  4. Idea安装Python插件并配置Python SDK

    第一步:在help/about中查看IDEA版本,作者IDEA 15.0.2 第二步:在http://plugins.jetbrains.com/plugin/631中下载python-143.116 ...

  5. c++ 替换修改一个文件夹下的所有文件的文件名

    代码简洁,亲测可用. 1,首先来获取(输出)一个文件夹中所有的文件名 void getFiles(string path, vector<string>& files) { //文 ...

  6. macOS & SVN

    macOS & SVN mac 下已经自带了svn环境; 使用 svn –version 查看版本号 安装方法: 已安装 XCode,只需要在 code > Preferences &g ...

  7. Whitecoin区块链钱包高级功能使用命令

    格式:NO-命令-命令概要-主要对象-参数 <必须参数> [可选参数]-含义-描述-需要未锁定钱包   1 addmultisigaddress 新增多重签名地址 地址 <nrequ ...

  8. P2236 [HNOI2002]彩票

    题目描述 某地发行一套彩票.彩票上写有1到M这M个自然数.彩民可以在这M个数中任意选取N个不同的数打圈.每个彩民只能买一张彩票,不同的彩民的彩票上的选择不同. 每次抽奖将抽出两个自然数X和Y.如果某人 ...

  9. Android热修复原理(一)热修复框架对比和代码修复

    在Android应用开发中,热修复技术被越来越多的开发者所使用,也出现了很多热修复框架,比如:AndFix.Tinker.Dexposed和Nuwa等等.如果只是会这些热修复框架的使用那意义并不大,我 ...

  10. ZOJ 1081 Within(点是否在多边形内)| 计算几何

    ZOJ 1081 Within 我使用的是"射线法":从该点出发,作一条向左的水平射线,与多边形的边的交点有奇数个则点在多边形内. 需要注意的点: 如果点在多边形的边上特判. 考虑 ...