《Python核心编程》18.多线程编程(二)

18.1没有线程支持

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from time import sleep, ctime

def loop0():
    print ‘start loop 0 at:‘, ctime()
    sleep(4)
    print ‘loop 0 done at‘, ctime()

def loop1():
    print ‘start loop 1 at:‘, ctime()
    sleep(2)
    print ‘loop 1 done at:‘, ctime()

def main():
    """顺序执行两个循环,即第一个循环执行完毕,才能执行第二个"""
    print ‘staring at:‘, ctime()
    loop0()
    loop1()
    print ‘all DONE at:‘, ctime()

if __name__ == ‘__main__‘:
    main()

18.2thread线程支持

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import thread
from time import sleep,ctime

def loop0():
    print ‘start loop 0 at:‘, ctime()
    sleep(4)
    print ‘loop 0 done at:‘, ctime()

def loop1():
    print ‘start loop 1 at:‘, ctime()
    sleep(2)
    print ‘loop 1 done at:‘, ctime()

def main():
    print ‘starting at:‘, ctime()
    thread.start_new_thread(loop0, ())
    # 函数start_new_thread()产生一个新线程来运行函数loop0()

    thread.start_new_thread(loop1, ())
    # 同上,两个线程同同时运行

    sleep(6)  # 主线程睡眠等待;如果主线程(此程序本身)没有停下来,就会直接运行下一条语句,不会等待两个线程运行完毕
    print ‘all DONE at: ‘, ctime()

if __name__ == ‘__main__‘:
    main()

18.3 使用线程和锁

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import thread
from time import sleep, ctime

loops = [4, 2]
# 1储存每个循环的睡眠时间
# 2间接说明了循环的个数

def loop(nloop, nsec, lock):
    """记录循环的号码和睡眠时间,并添加锁"""
    print ‘start loop‘, nloop, ‘at:‘, ctime()
    sleep(nsec)
    print ‘loop‘, nloop, ‘done at:‘, ctime()
    lock.release()  # 当sleep()时间结束,释放锁用以通知主线程,此子线程已结束

def main():
    """包含三个循环:创建锁;创建线程并分配锁;线程结束并解锁"""
    print ‘Starting at:‘, ctime()
    locks = []
    nloops = range(len(loops))  # 利用列表元素个数说明循环次数

    for i in nloops:
        lock = thread.allocate_lock()  # allocate_lock()函数分配锁对象
        lock.acquire()  # 获取锁对象
        locks.append(lock)  # 创建锁列表

    for i in nloops:
        thread.start_new_thread(loop, (i, loops[i], locks[i]))  # 创建循环线程

    for i in nloops:
        while locks[i].locked():  # 主线程对锁对象进行检查(暂停主线程)。当有线程结束,解锁,主线程才执行下条语句
            pass

    print ‘all DONE at:‘, ctime()

if __name__ == ‘__main__‘:
    main()

18.4使用threaging 模块

#!usr/bin/env python
# -*- coding:utf-8 -*-

"""创建一个Thread(threading模块中的类)的实例,传给它一个函数"""

import threading
from time import sleep, ctime

loops = [4, 2]
# 1储存每个循环的睡眠时间
# 2间接说明了循环的个数

def loop(nloop, nsec):
    """1记录循环的号码 2记录睡眠时间"""
    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 = threading.Thread(target=loop, args=(i, loops[i]))
        # 1实例化Thread类对象,将函数(target)和参数(args)传入,得到返回的Thread实例:线程对象t。
        # 2实例化(调用)Thread类时,不会像thread.star_new_thread那样,线程立即开始,这样可以更好的同步。
        threads.append(t)  # 创建对象列表

    for i in nloops:
        threads[i].start()  # 开始线程的执行

    for i in nloops:
        threads[i].join()
        # 1调用join()方法后,主线程会等到线程结束才执行下条语句,相比使用等待锁释放的无线循环(自旋锁)更为清楚。
        # 2若主线程除了等待线程结束外,还有其他事情要做(如处理或等待其他的客户请求),就不用调用join()。主线程
        #  依然会等待线程执行完毕。

    print ‘all DONE at:‘, ctime()

if __name__ == ‘__main__‘:
    main()

18.5使用threading模块

#!/usr/bin/env python
# -*- coding:utf-8 -*-

"""创建一个Thread实例,传给它一个可调用的类对象"""

import threading
from time import sleep, ctime

loops = [4, 2]
# 1储存每个列表的循环时间
# 2间接说明循环的个数

class ThreadFunc(object):
    """
    想让这个类在调用函数方面尽量地通用,并不局限与loop()函数。
    这个类保存了函数本身,函数的参数,以及函数名字的字符串。
    构造函数__init__()中做了这些值的赋值操作。
    """

    def __init__(self, func, args, name=‘‘):
        super(ThreadFunc, self).__init__()
        self.name = name
        self.func = func
        self.args = args

    def __call__(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 = threading.Thread(target=ThreadFunc(loop, (i, loops[i]), loop.__name__))
        # 1.实例化Thread对象时,同时也会实例化ThreadFunction对象,即实例化了两个对象
        # 2.由于已经有了要用的参数,就不用额外添加参数到Thread()的构造器中
        # 3.这里时传送类对象,而18.4中传送的是函数

        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()
时间: 2024-11-05 20:28:40

《Python核心编程》18.多线程编程(二)的相关文章

18 多线程编程 - 《Python 核心编程》

?? 引言/动机 ?? 线程和进程 ?? 线程和 Python ?? thread 模块 ?? threading 模块 ?? 生产者-消费者问题和 Queue 模块 ?? 相关模块 18.1 引言/动机 18.2 线程和进程 什么是进程? 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据.它们只有在被读取到内 存中,被操作系统调用的时候才开始它们的生命期.进程(有时被称为重量级进程)是程序的一次 执行.每个进程都有自己的地址空间,内存,数据栈以及其它记录其运行轨迹的辅助数据.操作系

廖雪峰Java13网络编程-1Socket编程-3TCP多线程编程

TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通常使用一个无限for循环,在这个for循环内部,每次调用accept方法,返回一个与远程客户新建的Socket连接,紧接着启动一个新的线程,来处理这个连接. ServerSocket ss = new ServerSocket(port); for( ; ; ){ Socket sock = ss.

《Python核心编程》18.多线程编程(三)

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类

《Python核心编程》 18.多线程编程(一)

一进程和线程 1参考链接: http://www.zhihu.com/question/25532384 中OF小工和zhonyong 的回答 总结他们两的回答: 引言: 1.电脑的运行,在硬件上是CPU.相关寄存器.RAM之间的事情.负责处理任务的顺序有CPU决定. 2.程序的上下文:当CPU处理任务时,所需要的各种资源(显卡.寄存器等)准备完毕,构成了这个程序的执行环境,即上下文. 3.CPU处理任务顺序:先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程

python核心编程(多线程编程)

1.全局解释器锁 2.threading模块 thread类 原文地址:https://www.cnblogs.com/goobai/p/8689060.html

python并发编程之多线程编程

一.threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 二.开启线程的两种方式 方式一: from threading import Thread import time import random def task(name): print('%s is running' %name) time.sleep(random.randint(1,3)) print('%s is end' %name)

《Python核心编程》 第3版 中文版pdf

下载地址:网盘下载 内容简介 编辑 Python是一种功能十分强大的面向对象编程语言,可以用于编写独立程序.快速脚本和复杂应用的原型.作为一种开源软件,Python可以自由获取,而且非常易学易用.本书是Python语言的经典入门读本,由两名顶尖的Python技术专家兼培训专家联手撰写,涵盖了该语言的所有核心内容.所有练习的解答都可在书后找到. 本书描述了Python程序的基本构件:类型.操作符.语句.函数.模块.类以及异常和介绍了更多高级主题,包括复杂的实例.无论是用于编写简单的脚本,还是复杂的

python核心编程第二版

初学Python这是一本有关Python开发的指南涵盖近期发布的Pyttlon版本的核心功能特性,而不仅仅是语法学习更多的高阶内容,如正则表达式.网络.多线程.图形用户界面.Web/CGl和Python扩展等包括几个全新的章节,关于数据库.网络客户端.Java/Jytt30n和Microsoft Office等 展示数以百计的代码片段.交互实例和大量加强您的Python技能的实用练习"对Wesley Chun<Python核心编程>第二版的漫长等待是值得的--它的深邃.它的全面,以及

Python核心编程 第3版 中文版pdf

[下载地址] <Python核心编程(第3版)>是经典畅销图书<Python核心编程(第二版)>的全新升级版本,总共分为3部分.第1部分为讲解了Python的一些通用应用,包括正则表达式.网络编程.Internet客户端编程.多线程编程.GUI编程.数据库编程.Microsoft Office编程.扩展Python等内容.第2部分讲解了与Web开发相关的主题,包括Web客户端和服务器.CGI和WSGI相关的Web编程.Django Web框架.云计算.高级Web服务.第3部分则为一