《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类
随机推荐
- winform(三)——更换主窗体例子
做一个登录窗口,登录成功时关闭form1,展示from2界面 1.主界面Login namespace WindowsFormsApplication1 { public partial class ...
- StarkSoft题库管理系统(二)--生成word格式试卷
一.功能介绍 1.自定义试题库管理系统目录.难易程度,题型,知识库等. 2.试题录入. 3.强大的试题编辑功能,并与通常应用编辑工具有共通. 4.灵活的试卷构造功能,用户可自定 ...
- Windows驱动——虚拟机 虚拟串口 双机调试
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- Nagios监控平台搭建
Nagios是一款开源的免费网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员, ...
- Mysql日志解析
修改Mysql配置 Mysql配置地址为: C:\Program Files (x86)\MySQL\MySQL Server 5.5 如果无法修改可以把my.ini拷贝出来,修改完后,再拷贝回去! ...
- 基于.net开发chrome核心浏览器【七】
这是一个系列的文章,前面六篇文章的地址如下: 基于.net开发chrome核心浏览器[六] 基于.net开发chrome核心浏览器[五] 基于.net开发chrome核心浏览器[四] 基于.net开发 ...
- Java常见问题
1. eclipse permgen space 问题: debug configrations - vm arguments最后设置:-Xms256m -Xmx512m -XX:MaxNe ...
- 第一轮复习完毕,kmp走起
//代码via:http://blog.csdn.net/v_JULY_v/article/details/6111565 //简单思路via:http://study.163.com/course/ ...
- UVALive 4864 Bit Counting --记忆化搜索 / 数位DP?
题目链接: 题目链接 题意:如果一个数二进制n有k位1,那么f1[n] = k,如果k有s位二进制1,那么f2[n] = f1[k] = s. 如此往复,直到fx[n] = 1,此时的x就是n的”K ...
- Easy UI常用插件使用
一.easy UI是类似于jQuery UI的插件库,它提供了丰富的各种常用插件:tree.datagrid... tree插件: 语法:$(selector).tree([settings]); 常 ...