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()

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

  1. Java多线程编程(2)--多线程编程中的挑战

    一.串行.并发和并行   为了更清楚地解释这三个概念,我们来举一个例子.假设我们有A.B.C三项工作要做,那么我们有以下三种方式来完成这些工作:   第一种方式,先开始做工作A,完成之后再开始做工作B ...

  2. 进阶Java编程(1)多线程编程

    Java多线程编程 1,进程与线程 在Java语言里面最大的特点是支持多线程的开发(也是为数不多支持多线程的编程语言Golang.Clojure方言.Elixir),所以在整个的Java技术学习里面, ...

  3. SDK编程之多线程编程

    本课中,我们将学习如何进行多线程编程.另外我们还将学习如何在不同的线程间进行通信. 理论:前一课中,我们学习了进程,其中讲到每一个进程至少要有一个主线程.这个线程其实是进程执行的一条线索,除此主线程外 ...

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

    TCP多线程编程 一个ServerSocket可以和多个客户端同时建立连接,所以一个Server可以同时与多个客户端建立好的Socket进行双向通信. 因此服务器端,当我们打开一个Socket以后,通 ...

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

    18.6使用threading模块 #!/usr/bin/env python # -*- coding:utf-8 -*- """从Thread类中派生出一个子例,创建 ...

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

    一进程和线程 1参考链接: http://www.zhihu.com/question/25532384 中OF小工和zhonyong 的回答 总结他们两的回答: 引言: 1.电脑的运行,在硬件上是C ...

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

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

    1.全局解释器锁 2.threading模块 thread类

  9. linux编程之多线程编程

    我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下载软件,一方面 ...

随机推荐

  1. DDD实施经验分享—价值导向、从上往下进行(圈内第一个吃螃蟹DDD实施方案)

    阅读目录: 1.背景 2.从业务开始 3.从战略到战术 4.借助外力推动研发(QA.领导.自动化测试) 5.领域模型与SAAS平台的内核(价值最大化) 6.最后 1.背景 DDD本身的技术就不介绍了, ...

  2. 曲演杂坛--当ROW_NUMBER遇到TOP

    值班期间研发同事打来电话,说应用有超时,上服务器上检查发现有SQL大批量地执行,该SQL消耗IO资源较多,导致服务器存在IO瓶颈,细看SQL,发现自己都被整蒙了,不知道这SQL是要干啥,处理完问题赶紧 ...

  3. SCCM 2012 R2安装部署过程和问题(三)

    上篇 SCCM 2012 R2安装部署过程和问题(二) 个人认为对于使用SCCM 2012的最重要的经验是耐心. SCCM采用分布式部署的架构,不同的站点角色可以部署在不同的服务器上,站点角色之间的通 ...

  4. Ubuntu配置OpenLDAP

    sudo apt-get install slapd ldap-utils sudo dpkg-reconfigure slapd sudo apt-get purge slapd sudo apt- ...

  5. 在Azure上实现Linux Server故障转移

    要充分利用公有云的弹性扩展和高可用, 首先要在应用系统层面支持横向扩展(scale out),这个说起来很容易,或者说对新开发的应用系统而言已经成为标配.但是对已有的.老旧的应用系统来说,这就比较困难 ...

  6. selenium对Alert弹框的多种处理

    Alert弹框是一个很烦人的控件,因为当前页面如果弹出了该弹框,你必须要处理它,不然你就不能操作页面的其它元素,下面我列出了alert弹框在多种场景下的处理办法. 明确知道系统哪个地方会弹alert ...

  7. js事件绑定及深入

    学习要点: 1.传统事件绑定的问题2.W3C事件处理函数3.IE事件处理函数4.事件对象的其他补充 事件绑定分为两种:一种是传统事件绑定(内联模型,脚本模型),一种是现代事件绑定(DOM2级模型).现 ...

  8. HTML中的div,section,article的区别

    刚开始看到标签的就有些疑惑,觉得为什么有那么多相同用途的标签,多方查询资料细细比较之后才发现原来各有千秋,结合自己的想法总结如下: div在HTML早期版本就支持了,section和article是H ...

  9. video标签播放视频

    <!doctype html> <html> <head> <meta charset=utf-8> <title>测试</title ...

  10. AJAX提交方法(GET)Demon

    AJAX作为一种异步的Javascript程序执行方法,极大的弥补了HTTP协议的不足(HTTP协议为无状态协议),可以无需加载整个页面,只需加载所需数据即可,浏览器内置的XMLHttp对象有open ...