- 创建一个Thread的实例,传给它一个可调用的类对象
在练习18.5的例18.5时,照着例子抄错了,如下:
#!/usr/bin/env python
import threading
from time import ctime,sleep
class ThreadFuc(object):
def __init__(self,func,args,name=''):
self.name=name
self.func=func
self.args=args
def __call__(self):
#apply(self.func,self.args)
self.res=self.func(*self.args)
def loop(nloop,nsec):
print("%s start at %s"%(nloop,ctime()))
sleep(nsec)
print("%s ended at %s"%(nloop,ctime()))
def main():
nsect=[2,4]
threads=[]
nloop=range(len(nsect))
print("thread start at %s"%ctime())
for i in nloop:
t=threading.Thread(target=ThreadFuc(loop,(i,nsect[i]),loop.__name__))
threads.append(t)
for i in nloop:
threads[i].start()
for i in nloop:
threads[i].join()
print("all done at %s"%ctime())
if __name__=='__main__':
main()
第21行应该为nsect[i],却抄例子写错为loop[i],结果运行后就报错如下:
Traceback (most recent call last):
File "mtsleep4.py", line 28, in <module>
main()
File "mtsleep4.py", line 20, in main
t=threading.Thread(target=ThreadFuc(loop,(i,loop[i]),loop.__name__))
TypeError: 'function' object is unsubscriptable
即调用loop函数时找不到对应参数所以报错。此句即创建了一个ThreadFuc实例,比如a,此实例是可调用的,即运行a.call()。apply(self.func,self.args)在python1.6及以上版本中又可写为self.res=self.func(*self.args)。换句话说,即此实例执行self.res=loop(nsect[i])。这里loop为global值,如果将loop函数算入此类型的方法中,会报global name 'loop' is not defined。最终的运行结果如下:
thread start at Tue Jul 7 19:03:19 2015
0 start at Tue Jul 7 19:03:19 2015
1 start at Tue Jul 7 19:03:19 2015
0 ended at Tue Jul 7 19:03:21 2015
1 ended at Tue Jul 7 19:03:23 2015
all done at Tue Jul 7 19:03:23 2015
2. 从Thread派生一个类,创建这个类的一个实例myThread.py
#!/usr/bin/env python
import threading
from time import ctime,sleep
class MyThread(threading.Thread):
def __init__(self,func,args,name=''):
threading.Thread.__init__(self)
self.name=name
self.func=func
self.args=args
def run(self):
apply(self.func,self.args)
#self.res=self.func(*self.args)
def loop(nloop,nsec):
print("%s start at %s"%(nloop,ctime()))
sleep(nsec)
print("%s ended at %s"%(nloop,ctime()))
def add(num):
print("This is %s thread"%num)
def main():
nsect=[2,4]
threads=[]
nloop=range(len(nsect))
print("thread start at %s"%ctime())
for i in nloop:
t=MyThread(loop,(i,nsect[i]),loop.__name__)
threads.append(t)
for i in nloop:
threads[i].start()
for i in nloop:
threads[i].join()
print("all done at %s"%ctime())
if __name__=='__main__':
main()
3. 利用步骤2的方式来完成斐波那契,阶乘和累加:
#!/usr/local/env python
from time import ctime,sleep
from myThread import MyThread
def fib(n):
sleep(0.0005)
if (n==0):
return 0
elif n==1:
return 1
else:
return(fib(n-2)+fib(n-1))
def sum(n):
sleep(0.1)
if(n<=2):
return 1
else:
return(sum(n-1)+n)
def mult(n):
sleep(0.0001)
if(n<2):
return 1;
else:
return (n*mult(n-1))
def main():
fiction=[mult,sum,fib]
threads=[]
num=12
nloop=range(len(fiction))
print("*****Single thread******")
for i in nloop:
print("%s thread starts at %s"%(fiction[i].__name__,ctime()))
print(fiction[i](num))
print("%s thread ends at %s"%(fiction[i].__name__,ctime()))
print("*****Multi threads******")
for i in nloop:
t=MyThread(fiction[i],(num,),fiction[i].__name__)
threads.append(t)
for i in nloop:
threads[i].start()
for i in nloop:
threads[i].join()
print(threads[i].getResult())
print("Done!")
if __name__=='__main__':
main()
注意创建线程时,第二个参数是一个序列,而不是一个int值,这是apply函数所要求的。
4. 利用线程来实现生产者消费者:
#!/usr/local/env python
from myThread import MyThread
from Queue import Queue
from time import ctime,sleep
from random import randint
def writeQ(queue):
if not queue.full():
print("starting writer at %s"%ctime())
queue.put("x")
print("producing obj for Q...size now is %s"%queue.qsize())
def writer(queue,num):
sleep(0.1)
if num>0:
for i in range(num):
writeQ(queue)
def readeQ(queue):
if not queue.empty():
print("starting condutor at %s"%queue.get())
print("consumed obj for Q...size now is %s"%queue.qsize())
def reader(queue,num):
sleep(0.6)
if num> 0:
for i in range(num):
readeQ(queue)
def main():
q=Queue(10)
threads=[]
function=[writer,reader]
nloop=range(len(function))
print("***********Start production/conduction**************")
for i in nloop:
t=MyThread(function[i],(q,randint(2,4)),function[i].__name__)
threads.append(t)
for i in nloop:
threads[i].start()
for i in nloop:
threads[i].join()
print("*******************Done***************************")
if __name__=='__main__':
main()
分享到:
相关推荐
《Python核心编程(第3版)》是经典畅销图书《Python核心编程(第二版)》的全新升级版本,总共分为3部分。第1部分为讲解了Python的一些通用应用,包括正则表达式、网络编程、Internet客户端编程、多线程编程、GUI...
【目录】 前言 【关于Python】 【关于《Python核心编程》(第二版)】 ...第十八章 多线程编程 第十九章 图形用户界面编程 第二十章 Web编程 第二十一章 数据库编程 第二十二章 扩展Python 第二十三章 其他话题
Python核心编程 ·学习专业的Python风格、最佳实践和好的编程习惯; ·加强对Python对象、内存模型和Python面向对象特性的深入理解; ·构建更有效的Web、CGI、互联网、网络和其他客户端/服务器架构应用程序及软件...
《Python核心编程(第3版)》是经典畅销图书《Python核心编程(第二版)》的全新升级版本。 《Python核心编程(第3版)》总共分为3部分。第1部分为讲解了Python的一些通用应用,包括正则表达式、网络编程、Internet...
第18章 多线程编程 18.1 引言/动机 18.2 线程和进程 18.3 Python、线程和全局解释器锁 18.4 thread模块 18.5 threading模块 18.6 相关模块 18.7 练习 第19章 图形用户...
第1部分占据了大约三分之二的篇幅,阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程...
Python 核心编程》中文高清第二版。学习专业的Python风格、最佳实践和好的编程习惯;·加强对Python对象、内存模型和Python面向对象特性的深入理解;·构建更有效的Web、CGI、互联网、网络和其他客户端/服务器架构...
第1部分占据了大约三分之二的篇幅,阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程...
想进一步提升Python 编程水平?请深入分析真实应用 程序中使用的大量相关主题 t 涵盖了正则表达式、Internet/ 网络编程、GUI、SQL/ 数据库/ORM、线程、Web 开发 t 了解当前的开发趋势, 比如Google+、Twitter、 ...
·学习专业的Python风格、最佳实践和好的编程习惯; ·加强对Python对象、内存模型和Python面向对象特性的深入理解; ·构建更有效的Web、CGI、互联网、网络和其他客户端/服务器架构应用程序及软件; ·学习如何使用...
第1部分占据了大约三分之二的篇幅,阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程...
·学习专业的Python风格、最佳实践和好的编程习惯; ·加强对Python对象、内存模型和Python面向对象特性的深入理解; ·构建更有效的Web、CGI、互联网、网络和其他客户端/服务器架构应用程序及软件; ·学习如何...
通过用C等语言编写扩展来提升Python应用程序的性能 或者通过使用多线程增强I 0相关的应用程序的能力; 学习Python中有关数据库的API 以及如何在Python中使用各种不同的数据库系统 包括MySQL Postgres和 SQLite ">...
《Python核心编程(第3版)》是经典畅销图书《Python核心编程(第二版)》的全新升级版本,总共分为3部分。第1部分为讲解了Python的一些通用应用,包括正则表达式、网络编程、Internet客户端编程、多线程编程、GUI...
《Python核心编程(第2版)》是经典的Python指导书,在第一版的基础上进行了全面升级。全书分为两个部分:第1部分占据了大约三分之二的篇幅,阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python...
Python核心编程(第2版)是经典畅销图书《Python核心编程(第1版)》的全新升级版本,总共分为3部分。第1部分为讲解了Python的一些通用应用,包括正则表达式、网络编程、Internet客户端编程、多线程编程、GUI编程、...
·学习专业的Python风格、最佳实践和好的编程习惯; ·加强对Python对象、内存模型和Python面向对象特性的深入理解; ·构建更有效的Web、CGI、互联网、网络和其他客户端/服务器架构应用程序及软件; ·学习...
第1部分 Python核心 第1章 欢迎来到Python世界 第2章 快速入门 第3章 Python基础 ... 第18章 多线程编程 第19章 图形用户界面编程 第20章 Web编程 第21章 数据库编程 第22章 扩展Python 第23章 其他话题
·学习专业的Python风格、最佳实践和好的编程习惯; ·加强对Python对象、内存模型和Python面向对象特性的深入理解; ·构建更有效的Web、CGI、互联网、网络和其他客户端/服务器架构应用程序及软件; ·学习如何...