什么是线程
  线程也是一种多任务编程方法,可以利用计算机多核资源完成程序的并发执行。线程又被称为轻量级的进程。
线程的特征
  * 线程是计算机多核分配的最小单位
  * 一个进程可以包含多个线程
  * 线程也是一个运行的过程,消耗计算机资源,多个线程共享进程的资源和空间
  * 线程的创建删除消耗的资源都要远远小于进程消耗的资源
  * 多个线程之间执行互不干扰
  * 线程也有自己的特有属性,比如指令集,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. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_04-vuejs研究-vuejs基础-v-model指令

    <!DOCTYPE html> <html lang="en" xmlns:v‐on="http://www.w3.org/1999/xhtml&quo ...

  2. VMware安装Centos7超详细过程

    本篇文章主要介绍了VMware安装Centos7超详细过程(图文),具有一定的参考价值,感兴趣的小伙伴们可以参考一下 一.软硬件准备 软件:推荐使用VMwear,我用的是VMwear 12 镜像:Ce ...

  3. java使用新的(nio)遍历文件(支持文件后缀名、文件名正则表达式匹配)

    import org.junit.Test; import java.io.IOException; import java.nio.file.Files; import java.nio.file. ...

  4. Apache损坏无法使用怎么办

    已经 find / -name httpd | xargs rm -rf删光了httpd相关文件,但是使用yum install httpd 无法正常安装. 查看Httpd的状态是 解决办法: yum ...

  5. JQ也要面向对象~在JQ中扩展静态方法和实例方法(jq扩展方法)

    JQ也要面向对象,事实上,无论哪种开发语言,在开发功能时,都要把面向对象拿出来,用它的思想去干事,去理解事,面向对象会使问题简单化,清晰化,今天说两个概念“静态方法”与“实现方法”,这个在面向对象的语 ...

  6. 《精通并发与Netty》学习笔记(08 - netty4+springboot项目案例)

    本节通过案例介绍springboot与netty的集成 第一步:新建Spring Initializr 项目 我这里选择Gradle项目,也可选择Maven项目 (注意:最好选择自己下载gradle, ...

  7. 【转载】Bios报警声

    BB是报警的声音你可以根据报警声音长短,数目来判断问题出在什么地方 AWARD BIOS响铃声的一般含义是: 1短: 系统正常启动.这是我们每天都能听到的,也表明机器没有任何问题. 2短: 常规错误, ...

  8. Nginx 小入门记录 之 Nginx 配置文件解读(二)

    上一小节主要是记录一些环境准备和Nginx的安装,接下来对Nginx基本配置进行记录. 查看配置文件安装记录 可以通过以下Linux命令进行查看: rpm -ql nginx rpm 是liunx的包 ...

  9. Hash冲突的四种解决办法

    一.哈希表简介 非哈希表的特点:关键字在表中的位置和它自检不存在一个确定的关系,查找的过程为给定值一次和各个关系自进行比较,查找的效率取决于给定值进行比较的次数. 哈希表的特点:关键字在表中位置和它自 ...

  10. Django soft-delete软删除

    在django中,实现这个功能很简单,我们采用一个字段用来保存删除的时间.若记录没有被删除,那么设置该值为None,如果被删除,那么设置时间为删除的时间. class BaseSchema(model ...