'''
并发:同一个时间段内运行多个程序的能力 进程就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成 程序:食谱
数据集:鸡蛋、牛奶、糖等
进程控制块:记下食谱做到哪一步了 线程:最小的执行单元,程序中具体代码 比如:食谱中的具体操作方法
进程:最小的资源管理单元,线程,数据等等 比如:整个食谱 切换的操作者:操作系统
进程/线程切换原则:
1、时间片
2、遇到IO操作切换 代码执行input()函数时,本身不占cpu了,输入完成后再切回来。conn,client_addr = sock.accept()执行后不占cpu了,
开启了另一个有关监听的线程,当接收到数据是再切给accept 串行、并行、并发
并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。
所以说,并行是并发的子集 IO密集型任务:程序存在大量IO操作
计算密集型任务:程序存在大量计算操作 对于PYTHON的多线程处理:
IO密集型任务有优势
计算密集型任务不推荐使用多线程 ''' 多线程
import threading
import time def foo(n):
print('>>>>>%s' %n)
time.sleep(3) def bar(n):
time.sleep(5)
print('>>>>>%s' %n) s = time.time() t1 = threading.Thread(target=foo,args=(2,))
t1.start() # .start()方法激活线程,可以去抢cpu执行 t2 = threading.Thread(target=bar,args=(5,))
t2.setDaemon(True)  # 主线程结束不等待子线程
t2.start() t1.join()  # 加入主线程阻塞
# t2.join() print('ending!')
print('cost time:',time.time()-s)

线程的类继承式创建

import threading
import time class MyThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
# super().__init__() def run(self):
print('OK')
time.sleep(2)
print('end t1') t1 = MyThread()
t1.start()
print('ending')

线程三把锁

互斥锁

import threading
import time def sub():
global num lock.acquire() temp = num
time.sleep(0.1)
num = temp-1 lock.release() time.sleep(2) num = 100 lock = threading.Lock() l = []
for i in range(100):
t = threading.Thread(target=sub,args=())
t.start()
l.append(t) for t in l:
t.join() print(num)

递归锁

import threading
import time class MyThread(threading.Thread): def __init__(self):
super().__init__() def run(self):
self.foo()
self.bar() def foo(self):
RLock.acquire()
print('I am %s GET LOCKA-----%s' %(self.name,time.ctime())) RLock.acquire()
print('I am %s GET LOCKB-----%s' %(self.name,time.ctime()))
RLock.release()
# time.sleep(1) RLock.release()
# time.sleep(1) def bar(self):
RLock.acquire()
print('I am %s GET LOCKA-----%s' %(self.name,time.ctime()))
# time.sleep(1)
RLock.acquire()
print('I am %s GET LOCKB-----%s' %(self.name,time.ctime()))
RLock.release()
# time.sleep(2) RLock.release() RLock = threading.RLock()
# LockB = threading.Lock() for i in range(10):
t = MyThread()
t.start()

信号量

import threading
import time semaphore = threading.Semaphore(10) def foo():
semaphore.acquire()
print('OK')
time.sleep(1)
semaphore.release() for i in range(100):
t = threading.Thread(target=foo,args=())
t.start()

event对象

import threading,time

event = threading.Event() # 默认isSet()=False,加.wait()阻塞

def foo():
while not event.is_set():
print('wait.....')
event.wait(2) print('Connect to redis server') for i in range(5):
t = threading.Thread(target=foo,args=())
t.start() print('attempt to start redis server')
time.sleep(10)
event.set() # 主线程给子线程set()

队列

队列:基于锁实现的,用于多线程,保证线程安全的一种数据结构

############################################ FIFO先进先出模型
import queue q = queue.Queue(3) # 参数为队列最大数,不加参数默认无限大
print(q) q.put(11)
q.put('hello')
# q.put(3.14)
q.put(555,block = False) # 阻塞,如果队列满,报错
# q.put(555) # 大于最大值,会阻塞,等待队列中数据被拿走后在进队列 print(q.get())
print(q.get())
print(q.get())
# print(q.get(block = False)) # 阻塞,如果队空,报错 # print(q.get()) # 队列空后,会阻塞,等待队列被加入
############################################ LIFO后进先出模型
import queue q = queue.LifoQueue() q.put(11)
q.put(22)
q.put(33) while not q.empty():
print(q.get())
############################################ priority优先级模型
import queue q = queue.PriorityQueue() q.put([1,'']) # []表示一个序列数据类型,也可全部换成()
q.put([1,'']) # 优先级相同,优先级按照ascii码顺序
q.put([5,''])
q.put([3,''])
q.put([4,''])
q.put([2,'']) while not q.empty():
print(q.get())

队列的两个方法.join()和.task_done()  

两个方法必须配合使用

.join()方法阻塞进程,知道所有任务完成

.task_done()方法在每次队列执行完后必须添加

import queue,threading

q = queue.Queue()

def foo():
q.put(111)
q.put(222)
q.put(333)
q.join()
print('ok') def bar():
print(q.get())
q.task_done() # 每取一个队列,必须执行一条task_done()
print(q.get())
q.task_done()
print(q.get())
q.task_done() t1 = threading.Thread(target=foo,args=())
t1.start() t2 = threading.Thread(target=bar,args=())
t2.start()
'''
队列实例:生产者消费者模型
生产者:创建数据的模型
消费者:获取数据的模型 优点:
1、解耦合
2、实现并发
'''
import queue,threading,time
import random q=queue.Queue(50) def Producer(id):
count=1
while count<10: # 一次可做10个包子
if q.qsize()<20: # 当包子数小于20个,厨师才做
s=random.randint(1,100) # 包子代号
q.put(s)
print(id+" has made baozi %s"%s)
time.sleep(1) # 此IO可切线程,每做一个包子换另一个厨师,直到做够最小包子数
count+=1 def Consumer(id): while True:
s=q.get() # 取包子,s是代号
print("Consumer "+id+" has eat %s"%s)
time.sleep(2) for i in range(10):
t1=threading.Thread(target=Producer,args=(str(i),))
t1.start() for i in range(10): t=threading.Thread(target=Consumer,args=(str(i),))
t.start()

python3 线程_threading模块的更多相关文章

  1. python基础系列教程——Python3.x标准模块库目录

    python基础系列教程——Python3.x标准模块库目录 文本 string:通用字符串操作 re:正则表达式操作 difflib:差异计算工具 textwrap:文本填充 unicodedata ...

  2. python3.7 sys模块

    #!/usr/bin/env python __author__ = "lrtao2010" #python3.7 sys模块 #sys模块负责程序与python解释器的交互,提供 ...

  3. Python3之时间模块详述

    Python3之时间模块  time & datetime & calendar 一. 概述 python 提供很多方式处理日期与时间,转换日期格式是一个常见的功能. 时间元组:很多p ...

  4. Python3之logging模块浅析

    Python3之logging模块浅析   目录 Python3之logging模块浅析 简单用法 日志与控制台同时输出 一个同时输出到屏幕.文件的完成例子 日志文件截取 日志重复打印问题解决 问题分 ...

  5. x64内核HOOK技术之拦截进程.拦截线程.拦截模块

    x64内核HOOK技术之拦截进程.拦截线程.拦截模块 一丶为什么讲解HOOK技术. 在32系统下, 例如我们要HOOK SSDT表,那么直接讲CR0的内存保护属性去掉. 直接讲表的地址修改即可. 但是 ...

  6. Python3之turtle模块的使用

    Python3之turtle模块的使用     直接扣代码就行: import turtle as t t.pensize(4) t.hideturtle() t.colormode(255) t.c ...

  7. Python3:Requests模块的异常值处理

    Python3:Requests模块的异常值处理 用Python的requests模块进行爬虫时,一个简单高效的模块就是requests模块,利用get()或者post()函数,发送请求. 但是在真正 ...

  8. Python3中正则模块re.compile、re.match及re.search函数用法详解

    Python3中正则模块re.compile.re.match及re.search函数用法 re模块 re.compile.re.match. re.search 正则匹配的时候,第一个字符是 r,表 ...

  9. Python3安装Celery模块后执行Celery命令报错

    1 Python3安装Celery模块后执行Celery命令报错 pip3 install celery # 安装正常,但是执行celery 命令的时候提示没有_ssl模块什么的 手动在Python解 ...

随机推荐

  1. 「日常训练」 Soldier and Traveling (CFR304D2E)

    题意 (CodeForces 546E) 对一个无向图,给出图的情况与各个节点的人数/目标人数.每个节点的人只可以待在自己的城市或走到与他相邻的节点. 问最后是否有解,输出一可行解(我以为是必须和答案 ...

  2. DOM操作相关案例 模态对话框,简易留言板,js模拟选择器hover,tab选项卡,购物车案例

    1.模态框案例 需求: 打开网页时有一个普通的按钮,点击当前按钮显示一个背景图,中心并弹出一个弹出框,点击X的时候会关闭当前的模态框 代码如下: <!DOCTYPE html> <h ...

  3. adb usage

    使用安卓调试及自动化,不可避免的要使用adb,说明看起来很麻烦,进行简单记录,以便时候不时之需. usb连接手机调试就很简单了.首先,在手机端开启usb调试,即点击安卓版本项7次,就可以显示开发者菜单 ...

  4. go 语言模拟百度登录

    1.参考网上Python的例子自己写了一个go语言的.这个仅供学习技术参考,为了方便有部分参数直接phantomjs执行js获取,代码基本都有注释,测试打印没有删除,还请见谅! 2.本文参考http: ...

  5. ContOS软件包安装【零】

      选择是“Minimal”安装  ,最小化.  越简单,越不容易出错. 1.听一些老鸟分析,选择安装包时应该按最小化原则,即不需要的或者不确定是否需要的就不安装,这样可以最大程度上确保系统安全.(安 ...

  6. 问题 B: Prime Number

    题目描述 Output the k-th prime number. 输入 k≤10000 输出 The k-th prime number. 样例输入 10 50 样例输出 29 229 #incl ...

  7. 解决:Unable to execute dex: GC overhead limit exceeded

    转自http://blog.sina.com.cn/s/blog_6e334dc70101hnug.html Android打包时下面的错误: Unable to execute dex: GC ov ...

  8. AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程

    AMR无限增发代币至任意以太坊地址的漏洞利用及修复过程 0x00 项目简述 Ammbr主要目标是打造具有高度弹性且易于连接的分布式宽带接入平台,同时降低上网相关成本.Ammbr打算创建具有人工智能和智 ...

  9. KMP板子+Trie板子

    KMP算法是一个字符串匹配算法,最直白的用法就是在一个长度为n的字符串T中查找另一个长度为m字符串P的匹配(总之就是用于文本中进行单个字符串的匹配). 对于这个问题,暴力算法是很好做的,直接对于T的每 ...

  10. 【历史】- Unix英雄传:图文细数十五位计算机先驱

    Unix,一款多任务多用户操作系统,最早由AT&T公司员工及合作伙伴在贝尔实验室于1969年开发完成.Unix的衍生及克隆版本包括Berkeley Unix.Minix.Linux.AIX.A ...