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. StarkSoft题库管理系统(二)--生成word格式试卷

    一.功能介绍    1.自定义试题库管理系统目录.难易程度,题型,知识库等.    2.试题录入.    3.强大的试题编辑功能,并与通常应用编辑工具有共通.    4.灵活的试卷构造功能,用户可自定 ...

  2. Android开发究竟用什么工具,Eclipse||AS

    所谓公欲善其事必先利器,那就让我们来看一下android的开发工具吧,安卓的开发工具有Eclipse和Android Studio,另外还有IntelliJ IDEA,可能很多人并不知道. 首先看一下 ...

  3. 解决UDT中内存下不去的问题

         使用UDT库,编写简单的网络通信程序,发现了一个问题,关闭一部分连接后,程序占用内存并没有变化.      比如先连接500个,再连接另500个,先关掉后面500个,程序占用内存降一半,再关 ...

  4. android android 判断是否滑动

    (转自:http://blog.csdn.net/angle_rupert/article/details/6255522) 声明: float x_temp01 = 0.0f; float y_te ...

  5. nginx转发会 默认忽略 headers 中name带”_”的

    昨天遇到一个很蛋疼的问题,在提供的一个 http api中,有定义了一个"X_AUTH_TOKEN"自定义head,可是请求这个api时带上"X_AUTH_TOKEN&q ...

  6. documentbodyscrollTop的值总为零的解决办法

    有一个功能需要判断返回顶部按钮是否显示. JS代码如下: var sTop = document.body.scrollTop; if(sTop>100){ document.getElemen ...

  7. 关于Hadoop的集群环境下虚拟机采用NAT方式连不上网的解决

    使用虚拟机搭建hadoop集群的时候采用的是NAT方式联网,但是会出现时常掉网的现象,查看后排查了很久也没有发现什么问题. 很可能是Windows下的NAT服务没有开启,这时候尽管虚拟机和主机是在一个 ...

  8. IIS7.5使用web.config设置伪静态的二种方法(转)

    近几天公司里开发的项目有几个运行在IIS7.5上,由于全站采用的是伪静态,因此从网上找到两两种方法来实现.这两种方法各有优势:第一种比较灵活,只要把文件拷到根目录下,即可直接显示所有伪静态页面(适用于 ...

  9. 【C#】【Thread】BackgroundWorker的使用

    BackgroundWorker 可以用于启动后台线程. 主要的事件及参数: 1.DoWork --当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递Do ...

  10. How to create a launcher for a manually extracted program in Ubuntu

    Say we have a latest Blender extracted from the download package. We want to create a launcher for B ...