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.多线程编程(三)的更多相关文章

  1. 进阶Java编程(1)多线程编程

    Java多线程编程 1,进程与线程 在Java语言里面最大的特点是支持多线程的开发(也是为数不多支持多线程的编程语言Golang.Clojure方言.Elixir),所以在整个的Java技术学习里面, ...

  2. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

    [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...

  3. Java多线程编程(2)--多线程编程中的挑战

    一.串行.并发和并行   为了更清楚地解释这三个概念,我们来举一个例子.假设我们有A.B.C三项工作要做,那么我们有以下三种方式来完成这些工作:   第一种方式,先开始做工作A,完成之后再开始做工作B ...

  4. SDK编程之多线程编程

    本课中,我们将学习如何进行多线程编程.另外我们还将学习如何在不同的线程间进行通信. 理论:前一课中,我们学习了进程,其中讲到每一个进程至少要有一个主线程.这个线程其实是进程执行的一条线索,除此主线程外 ...

  5. 廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程

    TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通 ...

  6. 《Python核心编程》18.多线程编程(二)

    18.1没有线程支持 #!/usr/bin/env python # -*- coding:utf-8 -*- from time import sleep, ctime def loop0(): p ...

  7. 《Python核心编程》 18.多线程编程(一)

    一进程和线程 1参考链接: http://www.zhihu.com/question/25532384 中OF小工和zhonyong 的回答 总结他们两的回答: 引言: 1.电脑的运行,在硬件上是C ...

  8. 18 多线程编程 - 《Python 核心编程》

  9. python核心编程(多线程编程)

    1.全局解释器锁 2.threading模块 thread类

随机推荐

  1. SQL SERVER 2000通过链接服务器发送邮件出现错误

    案例环境: 服务器A系统: Windows Server 2000 数据库版本 : Microsoft SQL Server  2000 - 8.00.2282 (Intel X86) 服务器B系统: ...

  2. Tomcat:配置SSL

    SSL简述 SSL就是安全套接字层,是一种允许web浏览器和 web服务器通过安全连接通信的技术.这是一个双向的过程,这意味着 服务器和浏览器在发送数据之前加密所有交流的数据. SSL有一个重要的特点 ...

  3. HTML5【语法要点】

    一.头部设置 <!--页面窗口自动调整到设备宽度,并禁止用户及缩放页面--> <meta name="viewport" content="width= ...

  4. redis 配置

    一 Redis 支持写的指令 Redis大概的命令如下:set setnx setex appendincr decr rpush lpush rpushx lpushx linsert lset r ...

  5. Tomcat关闭日志catalina.out

    catalina.out文件会越来越大,对系统的稳定造成了一定的影响.conf/logging.properties 一般在部署Tomcat后,运行久了,catalina.out文件会越来越大,对系统 ...

  6. ios合并静态库

    lipo -create SQY/iOS/iphoneos/libGamePlusAPI.a SQY/iOS/iphonesimulator/libGamePlusAPI.a -output SQY/ ...

  7. 架构实例之SpringTest

    架构实例之SpringTest 1.开发工具和开发环境       开发工具: MyEclipse10,JDK1.6.0_13(32位),Tomcat7.0(32位),mysql5.7.13 开发环境 ...

  8. Java程序设计之最大公约数和最小公倍数

    题目:输入两个正整数number1和number2,求其最大公约数和最小公倍数. 算法:较大数和较小数取余,较小数除余数,一直到余数为0时,为最大公约数(辗转相除法):最大公倍数numbe1*numb ...

  9. Java程序设计之整数分解

    题目:题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 解题过程也很简单,下面直接上代码了: import java.util.ArrayList; import java. ...

  10. 2016-2017-1 《信息安全系统设计基础》 学生博客及Git@OSC 链接

    2016-2017-1 <信息安全系统设计基础> 学生博客及Git@OSC 链接 博客 1452 20145201李子璇 20145202马 超 20145203盖泽双 20145204张 ...