python核心编程(第三版) 第四章 -多线程编程

本文详细介绍了Python的多线程编程,包括全局解释器锁(GIL)、thread和threading模块的使用,以及如何创建和管理线程。通过实例展示了线程的并发执行和同步机制,探讨了在Python中何时不应使用线程。最后,讨论了threading模块的高级特性,如自定义Thread子类来获取线程返回值。
摘要由CSDN通过智能技术生成

一、线程和python

1、全局解释器锁

Python代码的执行是由Python虚拟机(又名解释器主循环)进行控制的;
在主循环中同时只能有一个控制线程在执行;
内存中可以有许多程序,但是在任意给定时刻只能有一个程序在运行。
尽管Python解释器中可以运行多个线程,但是在任意给定时刻只有一个线程会被解释器执行。
对 Python虚拟机的访问是由**全局解释器锁(GIL)**控制的。这个锁就是来保证同时只能有一个线程运行的。
当调用外部代码(即,任意C/C++扩展的内置函数)时,GIL会保持锁定,直至函数执行结束。

2、退出线程

当一个线程完成函数的执行时它就会退出。你还可以通过调用诸如thread.exit()之类的退出函数,或者sys.exit()之类的退出python进程的标准方法,亦或抛出SystemExit异常,来使线程退出。不过,你不能直接“终止”一个线程。

3、在Python中使用线程

Python虽然支持多线程,但是还需要取决于它所运行的操作系统。绝大多数的类UNIX平台以及Windows平台都是支持多线程的。
Python使用兼容POSIX的线程,也就是众所周知的pthread。

4、不使用线程的情况

使用但线程执行循环:

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

'''
使用单线程执行循环
'''

__author__ = 'TaoGuan'

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())
    loop0()
    loop1()
    print('all DONE at:',ctime())
if __name__ == '__main__':
    main()

运行结果:

starting at: Sat Sep 29 09:50:06 2018
start loop 0 at: Sat Sep 29 09:50:06 2018
loop 0 DONE at: Sat Sep 29 09:50:10 2018
start loop 1 at: Sat Sep 29 09:50:10 2018
loop 1 DONE at: Sat Sep 29 09:50:12 2018
all DONE at: Sat Sep 29 09:50:12 2018

理论上,该程序执行完成至少需要6秒,从运行结果看,符合理论预期。那么,loop0盒loop1能不能并行执行呢?答案是肯定的。

二、thread模块

1、使用thread

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

'''
使用htread模块
'''

__author__ = 'TaoGuan'
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,())
    _thread.start_new_thread(loop1,())
    sleep(6)
    print('all DONE at:',ctime())

if __name__ == '__main__':
    main()

运行:

fwwdeair:4 fww$ python3 mtsleepA.py
starting at: Sat Sep 29 12:36:05 2018
start loop 0 at: Sat Sep 29 12:36:
Python核心编程(第3版)源代码 $ ls -lR .: total 60 drwxr-xr-x 2 wesc wesc 4096 Feb 27 13:02 ch01 drwxr-xr-x 2 wesc wesc 4096 Feb 25 02:32 ch02 drwxr-xr-x 2 wesc wesc 4096 Feb 27 13:06 ch03 drwxr-xr-x 2 wesc wesc 4096 Feb 27 13:09 ch04 drwxr-xr-x 2 wesc wesc 4096 Feb 28 02:52 ch05 drwxr-xr-x 2 wesc wesc 4096 Feb 27 14:35 ch06 drwxr-xr-x 2 wesc wesc 4096 Feb 28 02:52 ch07 drwxr-xr-x 3 wesc wesc 4096 Feb 27 01:51 ch08 drwxr-xr-x 2 wesc wesc 4096 Feb 27 14:48 ch09 drwxr-xr-x 2 wesc wesc 4096 Feb 29 01:49 ch10 drwxr-xr-x 4 wesc wesc 4096 Feb 29 23:35 ch11 drwxr-xr-x 2 wesc wesc 4096 Feb 29 01:50 ch12 drwxr-xr-x 2 wesc wesc 4096 Feb 29 22:05 ch13 drwxr-xr-x 2 wesc wesc 4096 Feb 29 22:05 ch14 drwxr-xr-x 2 wesc wesc 4096 Feb 29 22:07 ch15 -rw-r--r-- 1 wesc wesc 0 Mar 1 00:03 README.html ./ch01: total 40 -rwxr-xr-x 1 wesc wesc 643 Feb 25 02:06 gendata3.py -rwxr-xr-x 1 wesc wesc 591 Feb 25 02:08 gendata-64b.py -rwxr-xr-x 1 wesc wesc 620 Feb 25 02:08 gendata.py -rwxr-xr-x 1 wesc wesc 745 Feb 25 02:12 gendataU.py -rw-r--r-- 1 wesc wesc 347 Feb 25 02:31 README.html -rwxr-xr-x 1 wesc wesc 236 Feb 23 23:05 retasklist.py -rwxr-xr-x 1 wesc wesc 209 Feb 25 02:11 rewho3-hacker.py -rwxr-xr-x 1 wesc wesc 162 Feb 23 22:51 rewho3.py -rwxr-xr-x 1 wesc wesc 157 Feb 23 22:49 rewho.py -rwxr-xr-x 1 wesc wesc 205 Feb 23 23:01 rewhoU.py ./ch02: total 60 -rw-r--r-- 1 wesc wesc 452 Feb 25 02:32 README.html -rwxr-xr-x 1 wesc wesc 429 Sep 11 2010 tsTclnt3.py -rwxr-xr-x 1 wesc wesc 424 Sep 11 2010 tsTclnt3V6.py -rwxr-xr-x 1 wesc wesc 400 Sep 11 2010 tsTclnt.py -rwxr-xr-x 1 wesc wesc 413 Sep 11 2010 tsTclntSS.py -rwxr-xr-x 1 wesc wesc 724 Sep 11 2010 tsTclntTW.py -rwxr-xr-x 1 wesc wesc 395 Sep 11 2010 tsTclntV6.py -rwxr-xr-x 1 wesc wesc 665 Sep 11 2010 tsTserv3.py -rwxr-xr-x 1 wesc wesc 666 Sep 11 2010 tsTserv3V6.py -rwxr-xr-x 1 wesc wesc 560 Mar 18 2009 tsTserv.py -rwxr-xr-x 1 wesc wesc 492 Mar 18 2009 tsTservSS.py -rwxr-xr-x 1 wesc wesc 535 Sep 11 2010 tsTservTW.py -rwxr-xr-x 1 wesc wesc 561 S
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值