线程模块
          线程的特点:
               本质上是异步的、需要多个并发活动、每个活动的处理顺序可能是不确定的、或者说是随机的,不可预测的,宏观上是同时运行的
     
          进程与线程的关系:
               多任务可以由多进程完成,也可以由一个进程内的多线程完成,进程有若干个线程组成,一个进程至少有一个线程。在使用线程的过程中一般建议使用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. LGBMClassifier参数

    本文链接:https://blog.csdn.net/starmoth/article/details/845867091.boosting_type=‘gbdt’# 提升树的类型 gbdt,dart ...

  2. 杂项-FLAG

    题目 最低位隐写 50 4B 03 04 压缩格式zip的文件头 save bin 保存成zip格式 解压(WinRAR不能正常解压) 然后用vim打开(winhex也可以) hctf{dd0gf4c ...

  3. Kubernetes 集群分析查看内存,CPU

    Kubernetes方式 top命令查看所有pod,nodes中内存,CPU使用情况 查看pod root @ master ➜ ~ kubectl top pod -n irm-server NAM ...

  4. zz全面拥抱Transformer

    放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较 在辞旧迎新的时刻,大家都在忙着回顾过去一年的成绩(或者在灶台前含泪数锅),并对2019做着规划,当然也 ...

  5. 安卓Jsoup爬虫

    第一步:导入Jsoup包:把你的jar包放在libs下面之后 接着就会显示在你的这个地方: 重要的还是源码(搞了很久 出错很多 终于成功):我做的是输入要查找的关键字百度百科爬取主要定义,按照标签爬取 ...

  6. luoguP4213 【模板】杜教筛(Sum)杜教筛

    链接 luogu 思路 为了做hdu来学杜教筛. 杜教筛模板题. 卡常数,我加了register居然跑到不到800ms. 太深了. 代码 // luogu-judger-enable-o2 #incl ...

  7. [LeetCode] 731. My Calendar II 我的日历之二

    Implement a MyCalendarTwo class to store your events. A new event can be added if adding the event w ...

  8. [LeetCode] 436. Find Right Interval 找右区间

    Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...

  9. C++版本 ORM 访问数据库之ODB 的oracle Demo测试(二)

    有上篇文章已经说了odb的环境编译, 现在直接拿来给的例子进行数据库的增删改查操作测试 1. ODB访问oracle数据库_ 插入操作(insert) 直接运行上篇编译好的exe文件会出现如下错误 错 ...

  10. Tomcat启用HTTPS协议配置过程

    Article1较为简洁,Article2较为详细,测试可行. Article1 概念简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问 ...