《Python核心编程》18.多线程编程(三)
18.6使用threading模块
#!/usr/bin/env python
# -*- coding:utf-8 -*- """从Thread类中派生出一个子例,创建一个这个子类的实例""" import threading
from time import sleep, ctime loops = (4, 2) class MyThread(threading.Thread):
"""
1.子类化Thread类
2.要先调用基类的构造器,进行显式覆盖
3.重新定义run()函数
"""
def __init__(self, func, args, name=''):
super(MyThread, self).__init__()
self.name = name
self.func = func
self.args = args def run(self):
self.func(*self.args) def loop(nloop, nsec):
print 'start loop', nloop, 'at:', ctime()
sleep(nsec)
print 'loop', nloop, 'done at:', ctime() def main():
print 'starting at:', 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:', ctime() if __name__ == '__main__':
main()
18.7MyThread子类化
#!/usr/bin/env python
# -*- coding:utf-8 -*- """
1.单独化子类,让Thread的子类更加通用。
2.加上getResult()函数译返回函数的运行结果。 """
import threading
from time import ctime class MyThread(threading.Thread):
def __init__(self, func, args, name=''):
threading.Thread.__init__(self)
self.name = name
self.func = func
self.args = args def getResult(self):
return self.res def run(self):
print 'starting', self.name, 'at:', ctime()
self.res = apply(self.func, self.args)
print self.name, 'finished at:', ctime()
18.8斐波那契、阶乘、累加和
#!/usr/bin/env python
# -*- coding:utf-8 -*- from myThread import MyThread
from time import ctime, sleep def fib(x):
"""求斐波那契数列之和"""
sleep(0.005)
if x < 2:
return 1
return fib(x-2) + fib(x-1) def fac(x):
"""求阶乘"""
sleep(0.1)
if x < 2:
return 1
return x * fac(x-1) def sum_(x):
"""自然数累加和"""
sleep(0.1)
if x < 2:
return 1
return x + sum_(x-1) funcs = [fib, fac, sum_] # 将三个函数放到列表中
n = 12 def main():
nfuncs = range(len(funcs)) # nfuncs = range(3) print '*** SINGLE THREAD' # 单线程计算三个函数
for i in nfuncs:
print 'staring', funcs[i].__name__, 'at:', ctime() # 打印出函数名称,开始运行时间
print funcs[i](n) # 打印计算结果
print funcs[i].__name__, 'finished at:', ctime() # 打印出函数名称,结束运行时间 print '\n*** MULTIPLE THREADS' # 多线程计算三个函数
threads = []
for i in nfuncs:
t = MyThread(funcs[i], (n,), funcs[i].__name__) # 实例化三个MyThread对象
threads.append(t) # 将三个对象放到列表中 for i in nfuncs:
threads[i].start() # 启动三个线程 for i in nfuncs:
threads[i].join() # join()会等到线程结束或超时,即允许主线程等待线程结束
print threads[i].getResult() # 调用对象的getResult()方法 print 'all DONE' if __name__ == '__main__': # 独立运行脚本,即在此脚本在直接运行时,才会调用main()函数
main()
18.9生产者-消费者问题
#!/usr/bin/env python
# -*- coding: utf8 -*- from random import randint # randint随机进行生产和消耗
from time import sleep
from Queue import Queue
from myThread import MyThread def writeQ(queue):
print 'producing object for Q...', queue.put('xxx', 1) # 把xxx对象放进队列中,并等待队列中有空间为止
print "size now", queue.qsize() # 返回队列大小 def readQ(queue):
val = queue.get(1) # 从队列中取出一个对象(消耗)
print 'consumed object form Q... size now', queue.qsize() # 返回队列大小 def writer(queue, loops):
"""一次往队列中放进一个对象,等待一会,然后再做给定次数的相同的事"""
for i in range(loops):
writeQ(queue) # 调用writeQ,放进一个对象
sleep(randint(1, 3)) # 随机睡眠1~3秒 def reader(queue, loops):
"""一次从队列中取出一个对象,等待一会,然后做给定次数的相同的事"""
for i in range(loops):
readQ(queue)
sleep(randint(2, 5)) # 睡眠时间比 write 中的长,以使 reader 在取数据的时候能够拿到数据 funcs = [writer, reader]
nfuncs = range(len(funcs)) def main():
nloops = randint(2, 5)
q = Queue(32) # 创建一个大小为32的对象,和 q 绑定 threads = []
for i in nfuncs:
t = MyThread(funcs[i], (q, nloops), funcs[i].__name__) # 实例化 writer, reader 这两个对象
threads.append(t) # 放入空列表中 for i in nfuncs:
threads[i].start() # 启动线程 for i in nfuncs:
threads[i].join() # join()会等到线程结束或超时,即允许主线程等待线程结束 print 'all DONE' if __name__ == '__main__': # 独立运行脚本
main()
《Python核心编程》18.多线程编程(三)的更多相关文章
- 进阶Java编程(1)多线程编程
Java多线程编程 1,进程与线程 在Java语言里面最大的特点是支持多线程的开发(也是为数不多支持多线程的编程语言Golang.Clojure方言.Elixir),所以在整个的Java技术学习里面, ...
- [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)
[.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...
- Java多线程编程(2)--多线程编程中的挑战
一.串行.并发和并行 为了更清楚地解释这三个概念,我们来举一个例子.假设我们有A.B.C三项工作要做,那么我们有以下三种方式来完成这些工作: 第一种方式,先开始做工作A,完成之后再开始做工作B ...
- SDK编程之多线程编程
本课中,我们将学习如何进行多线程编程.另外我们还将学习如何在不同的线程间进行通信. 理论:前一课中,我们学习了进程,其中讲到每一个进程至少要有一个主线程.这个线程其实是进程执行的一条线索,除此主线程外 ...
- 廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程
TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通 ...
- 《Python核心编程》18.多线程编程(二)
18.1没有线程支持 #!/usr/bin/env python # -*- coding:utf-8 -*- from time import sleep, ctime def loop0(): p ...
- 《Python核心编程》 18.多线程编程(一)
一进程和线程 1参考链接: http://www.zhihu.com/question/25532384 中OF小工和zhonyong 的回答 总结他们两的回答: 引言: 1.电脑的运行,在硬件上是C ...
- 18 多线程编程 - 《Python 核心编程》
- python核心编程(多线程编程)
1.全局解释器锁 2.threading模块 thread类
随机推荐
- TCP Provider The semaphore timeout period has expired
我们一数据库服务器上有个作业最近几天偶尔会遇到下面错误(敏感信息已做处理),主要是报"TCP Provider: The semaphore timeout period has expir ...
- SQL范式
第一范式:确保每列的原子性(字段不可分). 如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式. 释义: 1.每一列属性都是不可再分的属性值,确保每一列的原子性 ...
- WPF 自定义柱状图 BarChart
WPF 自定义柱状图 当前的Telerik控件.DevExpress控件在图表控件方面做得不错,但是有时项目中需要特定的样式,不是只通过修改图表的模板和样式就能实现的. 或者说,通过修改当前的第三方控 ...
- docker-9 supervisord 参考docker从入门到实战
参考docker从入门到实战 使用 Supervisor 来管理进程 Docker 容器在启动的时候开启单个进程,比如,一个 ssh 或者 apache 的 daemon 服务.但我们经常需要在一个机 ...
- linux(64位的系统)下nasm进行汇编链接时出现的问题
出现问题: $nasm -f elf hello.asm -o hello.o $ld -s hello.o -o hello ld: i386 architecture of input file ...
- WIN32下使用DirectSound接口的简单音频播放器(支持wav和mp3)
刚好最近接触了一些DirectSound,就写了一个小程序练练手,可以用来添加播放基本的wav和mp3音频文件的播放器.界面只是简单的GDI,dxsdk只使用了DirectSound8相关的接口. D ...
- 15、sql语句集,Linux 下PHP查询mysql
一.mysql 创建数据库 mysql密码,默认没有 如果想更改的话, mysqladmin -uroot password root123 登录 : [root@localhost ro ...
- Session跟SessionFactory的线程安全与非安全
SessionFactory负责创建session,SessionFactory是线程安全的,多个并发线程可以同时访问一个 SessionFactory 并从中获取Session实例. (Sessio ...
- jquery的curCSS方法
核心思想是用getComputedStyle获取样式,如果没有获取到就判断是不是动态创建的元素,如果是则用style获取行内样式.看重点(注释部分)代码吧! curCSS = function( el ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 角色权限的配置页面改进优化
往往开发的人不是维护的人,开发的单位不是维护的单位.信息的畅通沟通交流很多时候会有打折.扭曲.甚至是容易得到歪解.配置错业务操作权限.为了防止发生没必要的麻烦,甚至是发生重大错误,我们的软件需要不断换 ...