什么是线程
  线程也是一种多任务编程方法,可以利用计算机多核资源完成程序的并发执行。线程又被称为轻量级的进程。
线程的特征
  * 线程是计算机多核分配的最小单位
  * 一个进程可以包含多个线程
  * 线程也是一个运行的过程,消耗计算机资源,多个线程共享进程的资源和空间
  * 线程的创建删除消耗的资源都要远远小于进程消耗的资源
  * 多个线程之间执行互不干扰
  * 线程也有自己的特有属性,比如指令集,ID
threading.Thread()
  功能:创建线程对象
  参数:name 线程名称 默认 Thread-1
     target 线程函数
     args 元组   给线程函数位置传参
     kwargs 字典  给线程函数键值传参
  返回值:线程对象 t
  t.start()  启动线程 自动运行线程函数
  t.join([timeout]) 回收线程
  线程对象属性
    t.is_alive() 查看线程状态
    t.name  线程名称
    t.setName()  设置线程名称
    t.getName()  获取线程名称
    threading.currentThread()  获取当前线程对象
    t.daemon 属性
      默认情况主线程退出不会影响分支线程执行
      如果设置为True 则分支线程随主线程退出
      设置方法 :
        t.daemon = True
        t.setDaemon(True)
      判断属性值 t.isDaemon()
      * 要在start前设置,不能与join同用     创造自己的线程类
      步骤:
        1 继承 Thread
        2 加载 Thread上的 __init__
        3 重写run方法
from threading import Thread
from time import ctime,sleep
import threading def platy(song,sec):
for i in range(2):
print('Playting %s:%s,%s'%(song,ctime(),threading.currentThread().getName()))
sleep(sec) class MYThread(Thread):
def __init__(self,target,args=(),kwargs=None):
#1 super().__init__(target=target,args=args,kwargs=kwargs)
super().__init__()
self.target=target
self.args=args
self.kwargs=kwargs def run(self):
self.target(*self.args,**self.kwargs)
#1 super().run()
t = MYThread(target=platy,args=('交浅',),kwargs={'sec':2})
t.start()

--重写线程传参

 线程通信

   通信方法 :多个线程共享进程的空间,所以线程间通信使用全局变量完成。

   注意事项: 线程间使用全局变量往往要同步互斥机制保证通信安全

   线程同步互拆方法

     线程的event

       e = threading.Event() 创建事件对象

       e.wait([timeout])    如果e 为设置状态则不阻塞否则阻塞

       e.set()      将e变为设置状态

       e.clear()    清除设置

import threading
from time import sleep
s=None
e = threading.Event()
def bar():
print('bar山头')
e.wait()
global s
s= '天王盖地虚' def foo():
print('进出口令就是自己人') sleep(2)
if s=='天王盖地虚':
print('自己人')
else:
print('打死他')
e.set()
def fun():
sleep(1)
global s
s= '小允'
t1 =threading.Thread(target=bar)
t1.start()
t2 = threading.Thread(target=foo)
t2.start()
fun()
e.set()
t1.join()
t2.join()

--demo

 线程锁
  lock = threading.Lock()  创建锁对象
  lock.acquire()  上锁
  lock.release()  解锁
  * 也可以通过with 上锁,上锁状态调用aquire会阻塞
  
   python 线程的GIL问题(全局解释器锁)
  python ---> 支持多线程 ---> 同步互斥 ---> 加锁 ---> 超级锁,给解释器加锁 ---> 解释器同一时刻只能解释一个线程
  后果: 
    一个解释器同一时刻只能解释执行一个线程,所以导致python 线程效率低下。但是当遇到IO 阻塞时线程会主动让出解释器,因此python 线程更加适合高延迟的IO 程序并发
  解决方法:
    * 尽量用进程完成并发
    * 不适用C 解释器
    * 尽量使用多种方案组合的方式进行并发操作,线程用作高延迟IO

多线程理论———— threading的更多相关文章

  1. day36 joinablequeue、多线程理论、多线程的两种使用方式、守护线程、互斥锁、死锁、递归锁、信号量

    1.joinablequeue队列 joinablequeue与queue一样,也是一种队列,其继承自queue,也有queue中的put 与get 方法,但是在joinablequeue中有自己的 ...

  2. Python的多线程(threading)与多进程(multiprocessing )

    进程:程序的一次执行(程序载入内存,系统分配资源运行).每个进程有自己的内存空间,数据栈等,进程之间可以进行通讯,但是不能共享信息. 线程:所有的线程运行在同一个进程中,共享相同的运行环境.每个独立的 ...

  3. 基于Python的多线程模块Threading小结

    步入正题前,先准备下基本知识,线程与进程的概念. 相信作为一个测试人员,如果从理论概念上来说其两者的概念或者区别,估计只会一脸蒙蔽,这里就举个例子来说明下其中的相关概念. 平安夜刚过,你是吃到了苹果还 ...

  4. 伪多线程类threading.js

    前言: 虽然html5中已经提供Worker对象进行多线程的支持,可该对象在某些场合还是无法满足需求——因为它难以操作DOM元素. 而某些情况下,进行大量的js计算以及DOM元素调用的情况下,会出现脚 ...

  5. Python多线程(threading模块)

    线程(thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务. ...

  6. Python学习笔记16:标准库多线程(threading包裹)

    Python主要是通过标准库threading包来实现多线程. 今天,互联网时代,所有的server您将收到大量请求. server要利用多线程的方式的优势来处理这些请求,为了改善网络port读写效率 ...

  7. 【Python】 多线程并发threading & 任务队列Queue

    threading python程序默认是单线程的,也就是说在前一句语句执行完之前后面的语句不能继续执行(不知道我理解得对不对) 先感受一下线程,一般情况下: def testa(): sleep(1 ...

  8. Day10 多线程理论 开启线程

    多线程: 多线程和多进程的不同是他们占用的资源不一样, 一个进程里边可以包含一个或多个进程, 进程的开销大,线程的开销小. 打个比方来说:创建一个进程,就是创建一个车间.创建一个线程,就是在一个车间创 ...

  9. Python并发复习2 - 多线程模块threading

    一.多线程的调用 threading 模块建立在thread 模块之上.thread模块以低级.原始的方式来处理和控制线程,而threading 模块通过对thread进行二次封装, 提供了更方便的a ...

随机推荐

  1. haproxy配置文件实例

    [root@kube-node1 ~]# cat /etc/haproxy/haproxy.cfg global log /dev/log local0 log /dev/log local1 not ...

  2. 【JS新手教程】弹出两层div,及在LODOP内嵌上层

    前面的博文有个简单的弹出div层[JS新手教程]浏览器弹出div层1,有一层,不过为了提示,一般会不让用户可以点击该提示之外的地方的.如果让用户弹出层后,把其他的按钮和链接都设置不可用应该比较麻烦,如 ...

  3. supervieord的使用

    用途 守护进程,帮你管理其他进程,让其他进程成为后台进程 监控进程是否死掉,自动重启: 管理进程的启动,停止: 对进程输出的日志进行管理 每个进程使用不同的用户启动,这样可以使进程获得不同用户的权限 ...

  4. sws office-强大小巧的开源office

    sws office是一款由国际软件分享组织于2019年刚刚开发完成的一个开源office,目的是为了响应CR2019的号召,开发一个体积只有2.2MB,占用内存小,运行速度极快的office,它支持 ...

  5. fastadmin cms使用注意一

    addon和application还有前端配置后还需要 注意表配置

  6. CentOS7 卸载mysql(YUM源方式)

    防止重装 yum方式 查看yum是否安装过mysql yum list installed mysql* 如或显示了列表,说明系统中有MySQL  yum卸载 根据列表上的名字 yum remove ...

  7. hdoj1561 The more, The Better (树形dp,分组背包)

    题目链接:https://vjudge.net/problem/HDU-1561 题意:给一个森林,每个结点有个权值,求选m个结点的最大权值和,并且选子结点前必须先选父结点. 思路: 把每颗树的树根连 ...

  8. oracle父子级查询数据树结构

    select t.*, level , sys_connect_by_path (t .id, '-->') as tree from isc_res_res_r t connect by pr ...

  9. 2019年9月(System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本。)问题解决记录

    System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本. 在百度上寻找了很久,都说是权限的问题,可是更改过后一点效果也没有. 实际上真 ...

  10. 南昌网络赛J. Distance on the tree 树链剖分

    Distance on the tree 题目链接 https://nanti.jisuanke.com/t/38229 Describe DSM(Data Structure Master) onc ...