`
yeluowuhen
  • 浏览: 156198 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

python核心编程之18章线程

 
阅读更多
  1.  创建一个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核心编程第二版》是Python编程领域里一本经典的教程,由Wesley Chun撰写,深入浅出地介绍了Python语言的各个方面。这本书包含了丰富的实例程序,旨在帮助读者掌握Python编程的基础和高级技巧。通过分析书中...

    python核心编程(第3版)

    《Python核心编程(第3版)》是经典畅销图书《Python核心编程(第二版)》的全新升级版本,总共分为3部分。第1部分为讲解了Python的一些通用应用,包括正则表达式、网络编程、Internet客户端编程、多线程编程、GUI...

    Python核心编程(第3版)

    第1部分占据了大约三分之二的篇幅,阐释这门语言的“核心”内容,包括基本的概念和语句、语法和风格、Python对象、数字类型、序列类型、映射和集合类型、条件和循环、文件和输入/输出、错误和异常、函数和函数式编程...

    python核心编程源代码

    《Python核心编程源代码》是Python编程领域的一份宝贵资源,包含了Python核心编程第三版书籍中的所有示例代码。这些经过验证的代码片段是学习和理解Python编程基础、进阶特性和实践应用的重要参考。本资源特别关注了...

    Python核心编程全本

    除此之外,《Python核心编程全本》可能还会探讨一些高级主题,比如装饰器、生成器、上下文管理器,以及Python的并发编程模型,如线程和进程。这些内容能够帮助读者掌握Python的深度用法,从而在解决复杂问题时...

    《Python核心编程_第2版》PDF版本下载.txt

    根据提供的文件信息,我们可以推断出这是一份关于获取《Python核心编程_第2版》电子书PDF版本的资源分享。接下来,我们将基于这个信息,提取并生成与该书籍相关的IT知识点。 ### 一、书籍简介 《Python核心编程_第...

    python核心编程 英文版

    《Python核心编程》(英文版)是一本针对有一定Python基础的读者的进阶书籍。本书不是初学者的理想选择,而是适合那些已经具备了基础编程知识,且希望深入学习Python语言的人群。从各界赞誉中可以看出,这本书对...

    python核心编程代码

    "Python核心编程"是学习Python编程的重要资料,它涵盖了Python语言的基础和高级特性,包括数据结构、函数、类、模块、异常处理、文件操作等多个方面。 在"Python核心编程"的代码中,我们可以深入理解以下关键知识点...

    Head First Python、Python核心编程

    Python核心编程 ·学习专业的Python风格、最佳实践和好的编程习惯; ·加强对Python对象、内存模型和Python面向对象特性的深入理解; ·构建更有效的Web、CGI、互联网、网络和其他客户端/服务器架构应用程序及软件...

    Python核心编程.pdf(中文第二版)带目录

    《Python核心编程(中文第二版)》是一本深入讲解Python编程语言的经典著作,由Wesley Chun撰写。这本书详尽地介绍了Python语言的基础知识、高级特性以及实际应用,旨在帮助读者掌握全面的Python技能。全书共分为三...

    python核心编程中文版-PDF

    《Python核心编程中文版》是Python开发者的一本经典教程,旨在深入浅出地介绍Python语言的核心概念和技术。这本书覆盖了Python编程的各个方面,是初学者和有经验的程序员提升技能的宝贵资源。以下是对该书内容的详细...

    Python核心编程 高清 第3版 pdf 高清

    《Python核心编程(第3版)》是经典畅销图书《Python核心编程(第二版)》的全新升级版本。 《Python核心编程(第3版)》总共分为3部分。第1部分为讲解了Python的一些通用应用,包括正则表达式、网络编程、Internet...

    python核心编程第二版+答案

    《Python核心编程第二版》是Python编程领域的一本经典教材,由Wesley Chun撰写,旨在深入介绍Python语言的核心概念和技术。这本书对于初学者和有经验的开发者来说都是宝贵的资源,因为它不仅覆盖了Python的基础知识...

    Python 核心编程中文第二版资源

    《Python核心编程中文第二版》是一本深入探讨Python编程语言的经典著作,对于想要全面理解和掌握Python的程序员来说,是不可或缺的参考资料。这本书涵盖了Python的基础知识、高级特性以及实际应用,旨在帮助读者构建...

Global site tag (gtag.js) - Google Analytics