《Python核心编程》18.多线程编程(三)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了《Python核心编程》18.多线程编程(三),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3660字,纯文字阅读大概需要6分钟。
内容图文
![《Python核心编程》18.多线程编程(三)](/upload/InfoBanner/zyjiaocheng/1215/63b29c7604e449af9949c1dc86110b92.jpg)
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()
原文:http://www.cnblogs.com/twtp/p/5485674.html
内容总结
以上是互联网集市为您收集整理的《Python核心编程》18.多线程编程(三)全部内容,希望文章能够帮你解决《Python核心编程》18.多线程编程(三)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。