2016/1/3 Python中的多线程(2):threading模块
之前提了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模块的更多相关文章
- 2016/1/2 Python中的多线程(1):线程初探
---恢复内容开始--- 新年第一篇,继续Python. 先来简单介绍线程和进程. 计算机刚开始发展的时候,程序都是从头到尾独占式地使用所有的内存和硬件资源,每个计算机只能同时跑一个程序.后来引进了一 ...
- python中的多线程【转】
转载自: http://c4fun.cn/blog/2014/05/06/python-threading/ python中关于多线程的操作可以使用thread和threading模块来实现,其中th ...
- python中的多线程
一个程序可以理解为一个进程,这个进程有其代号,可以依据这个代号将其杀死. 一个进程肯定有且只有一个主线程,他可以有很多子线程. 运行一个任务如果可以有许多子线程同时去做,当然会提高效率. 但是,在py ...
- Python中的多线程编程,线程安全与锁(二)
在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...
- python中的多线程和多进程
一.简单理解一下线程和进程 一个进程中可有多个线程,线程之间可共享内存,进程间却是相互独立的.打比方就是,进程是火车,线程是火车厢,车厢内人员可以流动(数据共享) 二.python中的多线程和多进程 ...
- Python中的multiprocessing和threading
Python中的multiprocessing和threading分别使用来实现多进程编程和多线程编程的.其中threading比较简单,而前者比较繁琐. 下面,我们进行一下分析: 多线程--thre ...
- Python中操作mysql的pymysql模块详解
Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...
- python中的计时器:timeit模块
python中的计时器:timeit模块 (1) timeit - 通常在一段程序的前后都用上time.time()然后进行相减就可以得到一段程序的运行时间,不过python提供了更强大的计时库:ti ...
- Python中的多线程编程,线程安全与锁(一)
1. 多线程编程与线程安全相关重要概念 在我的上篇博文 聊聊Python中的GIL 中,我们熟悉了几个特别重要的概念:GIL,线程,进程, 线程安全,原子操作. 以下是简单回顾,详细介绍请直接看聊聊P ...
随机推荐
- Reaction to 构造之法 of Software Engineering From The First Chapter toThe Fifth Chapter
几个星期前,我阅读过一篇文章,一位老师教导自己的学生要积极地去阅读文学文献,其中,我很欣赏他的一句话:“Just think of liturature as if you're reading a ...
- week2-作业2
项目地址:https://git.coding.net/Rainoob/calculate.git ·1.需求分析:程序可以根据输入的参数n随机产生n道四则运算计算题,每个数字在0-100之间.运算符 ...
- Activity设置背景透明之开发坑
Activity设置背景透明的常规方法 方法一.在Manifest.xml中,直接在需要设置的Activity中添加主题样式: Android:theme="@android:style/T ...
- Internet History, Technology and Security (Week 6)
Week 6 Technology: Transport Control Protocol (TCP) Welcome to Week 6 of IHTS. We are in our second ...
- Apache+Nginx+php共存(一)
在实际开发中个人的电脑中经常需要安装 WNMRP.WAMRP.LNMRP.LAMRP等各种开发环境来应对不同的开发需求. 此篇主要是对WINDOWS系统下 Apache+Nginx + PHP +My ...
- DotNetty 跨平台的网络通信库
长久以来,.Net开发人员都非常羡慕Java有Netty这样,高效,稳定又易用的网络通信基础框架.终于微软的Azure团队,使用C#实现的Netty的版本发布.不但使用了C#和.Net平台的技术特点, ...
- 删除log日志中包含某个字符的行
sed -i '/{Str}/d' abc.txt 假如你的log日志中某行有sleep字符,直接输入命令: sed -i '/sleep/d' log.log 如果删除的是一个变量的值,假如是var ...
- HDU3452_Bonsai
题目的意思是给你一个棵树,每天边上有一个权值,现在要想根节点和每个叶子节点完全隔离开来,删除一些边,求最少需要删除的边权值综合是多少? 直接建模,以根节点为汇点,每个叶子节点连接虚拟源点流量无穷,树上 ...
- 【ActiveMQ】- 发布/订阅模式
publish/subscribe 特点:A发送的消息可以被所有监听A的对象的接收,就好比学校的广播,所有的学生都可以收听校园广播信息. 消息生产者: package com.zhiwei.advan ...
- ajax请求提交到controller后总是不成功
最近在做实习时,点击查询时在js中发送ajax请求到controller后台,但是无论怎么样都不成功,请求地址是正确的,因为在后台用system.out.println输出有值,并且也确实return ...