- 创建一个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核心编程第二版》是Python编程领域里一本经典的教程,由Wesley Chun撰写,深入浅出地介绍了Python语言的各个方面。这本书包含了丰富的实例程序,旨在帮助读者掌握Python编程的基础和高级技巧。通过分析书中...
《Python核心编程(第3版)》是经典畅销图书《Python核心编程(第二版)》的全新升级版本,总共分为3部分。第1部分为讲解了Python的一些通用应用,包括正则表达式、网络编程、Internet客户端编程、多线程编程、GUI...
第1部分占据了大约三分之二的篇幅,阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程...
《Python核心编程源代码》是Python编程领域的一份宝贵资源,包含了Python核心编程第三版书籍中的所有示例代码。这些经过验证的代码片段是学习和理解Python编程基础、进阶特性和实践应用的重要参考。本资源特别关注了...
除此之外,《Python核心编程全本》可能还会探讨一些高级主题,比如装饰器、生成器、上下文管理器,以及Python的并发编程模型,如线程和进程。这些内容能够帮助读者掌握Python的深度用法,从而在解决复杂问题时...
根据提供的文件信息,我们可以推断出这是一份关于获取《Python核心编程_第2版》电子书PDF版本的资源分享。接下来,我们将基于这个信息,提取并生成与该书籍相关的IT知识点。 ### 一、书籍简介 《Python核心编程_第...
《Python核心编程》(英文版)是一本针对有一定Python基础的读者的进阶书籍。本书不是初学者的理想选择,而是适合那些已经具备了基础编程知识,且希望深入学习Python语言的人群。从各界赞誉中可以看出,这本书对...
"Python核心编程"是学习Python编程的重要资料,它涵盖了Python语言的基础和高级特性,包括数据结构、函数、类、模块、异常处理、文件操作等多个方面。 在"Python核心编程"的代码中,我们可以深入理解以下关键知识点...
Python核心编程 ·学习专业的Python风格、最佳实践和好的编程习惯; ·加强对Python对象、内存模型和Python面向对象特性的深入理解; ·构建更有效的Web、CGI、互联网、网络和其他客户端/服务器架构应用程序及软件...
《Python核心编程(中文第二版)》是一本深入讲解Python编程语言的经典著作,由Wesley Chun撰写。这本书详尽地介绍了Python语言的基础知识、高级特性以及实际应用,旨在帮助读者掌握全面的Python技能。全书共分为三...
《Python核心编程中文版》是Python开发者的一本经典教程,旨在深入浅出地介绍Python语言的核心概念和技术。这本书覆盖了Python编程的各个方面,是初学者和有经验的程序员提升技能的宝贵资源。以下是对该书内容的详细...
《Python核心编程(第3版)》是经典畅销图书《Python核心编程(第二版)》的全新升级版本。 《Python核心编程(第3版)》总共分为3部分。第1部分为讲解了Python的一些通用应用,包括正则表达式、网络编程、Internet...
《Python核心编程第二版》是Python编程领域的一本经典教材,由Wesley Chun撰写,旨在深入介绍Python语言的核心概念和技术。这本书对于初学者和有经验的开发者来说都是宝贵的资源,因为它不仅覆盖了Python的基础知识...
《Python核心编程中文第二版》是一本深入探讨Python编程语言的经典著作,对于想要全面理解和掌握Python的程序员来说,是不可或缺的参考资料。这本书涵盖了Python的基础知识、高级特性以及实际应用,旨在帮助读者构建...