线程模块
          线程的特点:
               本质上是异步的、需要多个并发活动、每个活动的处理顺序可能是不确定的、或者说是随机的,不可预测的,宏观上是同时运行的
     
          进程与线程的关系:
               多任务可以由多进程完成,也可以由一个进程内的多线程完成,进程有若干个线程组成,一个进程至少有一个线程。在使用线程的过程中一般建议使用threading模块,相比于_thread高级一些。很多地方线程和进程是一样的
          
          threading模块的Thread类:
               属性: name ------>名字
                         ident ------->线程标识符
                         daemon ------->守护线程的标识,类型bool
               方法:__init__构造函数,和进程的构造函数差不多,可以参考进程的构造函数
                         start:线程启动
                         run:定义线程功能方法,一般是在子类重新定义的
                         join:在启动线程终止前一直挂起,timeout是阻塞时间
 
使用Thread类创建线程的三种方法:(直接看实例)
          ①创建Thread类实例,传给他一个函数
# 1、创建Thread类实例,传给它一个函数
# 线程的属性和方法
def task(task_id, task_time):
print("start task", task_id, "at", ctime())
sleep(task_time)
print("task", task_id, "done at", ctime()) if __name__ == "__main__":
print("准备创建线程")
# 创建Thread类实例,传给它一个函数,传参也是关键字参数
t = threading.Thread(target=task, args=(1, 2))
print("准备启动线程")
# 两种设置守护线程的方式,
# 守护线程和守护进程就是主进程运行完,守护进(线)程立刻结束
# t.setDaemon(True)
t.daemon = True
t.start()
# 名字以Thread-N起名,N从1开始
print("线程的名字:", t.name)
print("线程的id:", t.ident)
print("线程已经启动")
  ②创建Thread的实例,传给他一个可调用的实例化对象
# 2、创建Thread的实例,传给他一个可调用的类的实例化对象
# 重写方法__call__
def task(task_id, task_time):
print("start task", task_id, "at", ctime())
sleep(task_time)
print("task", task_id, "done at", ctime()) # 创建一个简单的类
class ThreadFunc(object):
def __init__(self, *args):
super().__init__()
self.args = args # __call__功能是使得实例化对象也可以调用
def __call__(self, *args, **kwargs):
task(*self.args) if __name__ == "__main__":
t = threading.Thread(target=ThreadFunc(1, 2))
t.start()
t.join()

  ③派生Thread的子类,并创建子类的实例(推荐)

# 3、派生Thread的子类,并创建子类的实例(推荐)
def task(task_id, task_time):
print("start task", task_id, "at", ctime())
sleep(task_time)
print("task", task_id, "done at", ctime()) class MyThread(threading.Thread):
def __init__(self, *args):
super().__init__()
self.args = args def run(self):
task(*self.args) if __name__ == "__main__":
myThread = MyThread(1, 2)
# 这里不是调用run方法,和进程的使用差别不大
myThread.start()
myThread.join()
          线程的状态(一般是简化之后的)
                1. 新建(NEW):新创建了一个线程对象。
                2. 可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用 了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调 度选中,获取cpu 的使用权 。 
                3. 运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片( timeslice) ,执行程序代码。
                4. 阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了cpu 使用权,也 即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状 态,才有机会再次获得cpu timeslice 转到运行(running)状态。阻塞的情况 分三种:
        (一). 等待阻塞:sleep
        (二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线 程占用。
               5. 死亡(DEAD):线程run()、main() 方法执行结束,或者因异常退出了run() 方法,则该线程结束生命周期。死亡的线程不可再次复生。
 
 
               状态图切换:

  总结:在一个进程的多个线程是可以共享进程的全局变量的,但是多个线程若同时修改这个全局变量,就可能造成多个线程之间对全局变量的混乱(即线程是不安全的)下一篇就是就要讲到锁机制了。

 
 
 
 
 

python高级编程——线程和线程池的更多相关文章

  1. python高级编程——进程和进程池

    python提供了一个跨平台的多进程支持——multiprocessing模块,其包含Process类来代表一个进程对象 1.Process语法结构:(注: 传参的时候一定使用关键字传参) 2.自定义 ...

  2. 第十章:Python高级编程-多线程、多进程和线程池编程

    第十章:Python高级编程-多线程.多进程和线程池编程 Python3高级核心技术97讲 笔记 目录 第十章:Python高级编程-多线程.多进程和线程池编程 10.1 Python中的GIL 10 ...

  3. (九) 一起学 Unix 环境高级编程 (APUE) 之 线程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  4. (十) 一起学 Unix 环境高级编程 (APUE) 之 线程控制

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  5. python高级编程技巧

    由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr  ...

  6. 第九章:Python高级编程-Python socket编程

    第九章:Python高级编程-Python socket编程 Python3高级核心技术97讲 笔记 9.1 弄懂HTTP.Socket.TCP这几个概念 Socket为我们封装好了协议 9.2 cl ...

  7. 第十一章:Python高级编程-协程和异步IO

    第十一章:Python高级编程-协程和异步IO Python3高级核心技术97讲 笔记 目录 第十一章:Python高级编程-协程和异步IO 11.1 并发.并行.同步.异步.阻塞.非阻塞 11.2 ...

  8. python高级编程:有用的设计模式3

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#访问者:有助于将算法从数据结构中分离出来"&qu ...

  9. python高级编程:有用的设计模式2

    # -*- coding: utf-8 -*- __author__ = 'Administrator' #python高级编程:有用的设计模式 #代理 """ 代理对一 ...

  10. python高级编程:有用的设计模式1

    # -*- coding: utf-8 -*-__author__ = 'Administrator'#python高级编程:有用的设计模式#设计械是可复用的,某种程序上它对软件设计中觉问题提供的语言 ...

随机推荐

  1. Spark之RDD

    Spark学习之路Spark之RDD 目录 一.RDD的概述 1.1 什么是RDD? RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数 ...

  2. devops 下测试组织管理面临的挑战及应对

    导读 先从引发的5个问题讲起,再简单回顾一下devops 简介和兴起背景 ,再从itest 测试管理团队的视角提出应对办法 DevOps后,测试面临的挑战        敏捷开发必然是迭代开发管理模式 ...

  3. AVX 指令详解 ,还有SSE指令

    https://blog.csdn.net/fengbingchun/article/details/23598709 本人从来不复制的,自己看!.

  4. Quantization aware training 量化背后的技术——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference

    1,概述 模型量化属于模型压缩的范畴,模型压缩的目的旨在降低模型的内存大小,加速模型的推断速度(除了压缩之外,一些模型推断框架也可以通过内存,io,计算等优化来加速推断). 常见的模型压缩算法有:量化 ...

  5. JS高阶---回调函数

    1.什么函数是回调函数? 此时两者的执行并没有先后顺序 两个都是回调函数 满足三个特点就是回调 .定义了函数 .没有主动调用 .最后执行了 2.常见的回调函数有哪些? .DOM事件回调函数 .定时器回 ...

  6. mysql基础sql进阶

    回顾前面的基础命令语句 修改数据表 添加字段: alter table 表名 add 字段名 列类型[not null|null][primary key][unique][auto_incremen ...

  7. 201871010135 张玉晶《面向对象程序设计(java)》第十三周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/zyja/p/11918 ...

  8. sed与grep练习题

    第1章 练习题 第1题 取得/etc/hosts 文件的权限 如何取得/etc/hosts 文件的权限对应的数字内容,如-rw-r--r--  为 644,要求使用命令取得644 这样的数字. 方法一 ...

  9. JAVA并发-Condition

    简介 在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait().notify()系列方法可以实现等待/通知模式.在Java SE5后,Java提供了Lock接口, ...

  10. Dockerfile解析(八)

    一.Dockerfile是什么 Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 1. 构建的步骤 运行容器:docker run 构建新的镜像:docker ...