Python9-条件-定时器-队列-day40
复习
线程
线程是进程中的执行单位
线程是cpu执行的最小单位
线程之间资源共享
线程的开启和关闭以及切换的时间开销远远小于进程
线程本身可以在同一时间使用多个cpu,
python与线程
由于cpython解释器在解释代码过程中容易产生数据不安全的问题
GIL 全局解释器锁,锁的是线程
threading模块 守护进程
# 守护进程随着主代码的执行结束而结束
# 守护线程会在主线程结束之后等待子线程的结束才结束
# 主进程在执行完自己的代码之后不会立即结束,而是等待子进程结束之后,回收子进程资源
from threading import Thread
import time
def func1():
while True:
print('*'*10)
time.sleep(1)
def func2():
print('in func2')
time.sleep(5)
t = Thread(target=func1,)
t.daemon = True
t.start()
t2 = Thread(target=func2,)
t2.start()
t2.join()
print('主线程')
线程锁
from threading import Lock,Thread
import time
def func(lock):
global n
lock.acquire()
temp = n
time.sleep(0.2)
n = temp - 1
lock.release()
n = 10
t_lst = []
lock = Lock()
for i in range(10):
t = Thread(target=func,args=(lock,))
t.start()
t_lst.append(t)
for t in t_lst:t.join()
print(n)
from threading import RLock,Thread #Rlock是递归锁
import time
noodle_lock = fork_lock =RLock() #一个钥匙串上的2把钥匙
def eat1(name):
noodle_lock.acquire() #一把钥匙
print('%s拿到面条了'%name)
fork_lock.acquire()
print('%s拿到叉子了'%name)
print('%s吃面'%name)
fork_lock.release()
noodle_lock.release()
def eat2(name):
noodle_lock.acquire()
print('%s拿到叉子了'%name)
time.sleep(1)
fork_lock.acquire()
print('%s拿到面条了'%name)
print('%s吃面'%name)
fork_lock.release()
noodle_lock.release()
Thread(target=eat1,args=('alex',)).start()
Thread(target=eat2,args=('tim',)).start()
Thread(target=eat1,args=('fox',)).start()
Thread(target=eat2,args=('gi,',)).start()
信号量
from threading import Semaphore,Thread
import time def func(sem,a,b):
sem.acquire()
time.sleep(1)
print(a+b)
sem.release() sem = Semaphore(4)
for i in range(10):
t = Thread(target=func,args=(sem,i,i+5))
t.start()
# 连接数据库及检测数据库的可连接情况
# 数据库--文件夹
# 文件夹里有好多execl表格
# 能够更方便的对数据进行增删改查
# 安全访问机制
# 第一个线程:连接数据库
# 等待一个信号告诉我们之间的网络是通的
# 连接数据库
# 第二个进程:检测与数据库之间的网络是否联通
# time.sleep()
# 将事件的状态设置为true
from threading import Thread,Event
import time,random def connect_db(e):
count = 0
while count < 3:
e.wait(0.2) #状态为False的时候,只等待1秒钟就结束
if e.is_set() == True:
print('连接数据库成功')
break
else:
count += 1
print('第%s连接失败'%count)
else:
raise TimeoutError('数据库连接超时') def check_web(e):
time.sleep(random.randint(0,3))
e.set()
e = Event()
t1 = Thread(target=connect_db,args=(e,))
t2 = Thread(target=check_web,args=(e,))
t1.start()
t2.start()
对列
# q = queue.LifoQueue() #栈 先进后出
# q.put(1)
# q.put(2)
# q.put(3)
# print(q.get())
# print(q.get())
q = queue.PriorityQueue() #优先级队列
q.put((20,'a'))
q.put((10,'b'))
q.put((30,'c'))
print(q.get())
线程池
import time
from concurrent.futures import ThreadPoolExecutor
def func(n):
time.sleep(2)
print(n)
return n*n
tpool = ThreadPoolExecutor(max_workers=5) #默认不要超过cpu个数*5
t_lst = []
for i in range(20):
t = tpool.submit(func,i)
t_lst.append(t)
tpool.shutdown() #close和join 两项操作
print('主线程')
for t in t_lst:print('***',t.result())
import time
from concurrent.futures import ThreadPoolExecutor
def func(n):
time.sleep(2)
print(n)
return n*n
tpool = ThreadPoolExecutor(max_workers=5) #默认不要超过cpu个数*5
tpool.map(func,range(20)) #拿不到返回值
import time
from concurrent.futures import ThreadPoolExecutor
def func(n):
time.sleep(2)
print(n)
return n*n def call_back(m):
print('结果是%s'%m.result()) tpool = ThreadPoolExecutor(max_workers=5) #默认不要超过cpu个数*5
for i in range(20):
t = tpool.submit(func,i).add_done_callback(call_back)
Python9-条件-定时器-队列-day40的更多相关文章
- Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures
参考博客: https://www.cnblogs.com/xiao987334176/p/9046028.html 线程简述 什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线 ...
- python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)
昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...
- 一个基于C++11的定时器队列(timerfd,poll实现)
目录 前言 优点 test 源代码 @ 前言 最近小程序要用到定时器,找了一圈也没找到合适的,最后还是绕回来选择了muduo里面的TimerQueue,整理了下它的代码,独立了出来,因为实在懒得从头写 ...
- muduo网络库学习笔记(三)TimerQueue定时器队列
目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...
- mutiprocessing 同步类型,如锁,条件和队列官方案例:
官方文档:https://docs.python.org/2/library/multiprocessing.html#module-multiprocessing 1. 同步类型,如锁,条件和队列官 ...
- python_线程的开启、守护线程、锁、死锁、事件、定时器、条件、队列、池
0.承上 什么是线程? CPU调度的最小单位. 线程是进程的必要组成单位. 主线程: 程序开始运行的时候,就产生了一个主线进程来运行这个程序. 子线程: 是由主线程开启的其他线程. · 各线程之间的工 ...
- 27 python 初学(信号量、条件变量、同步条件、队列)
参考博客: www.cnblogs.com/yuanchenqi/articles/5733873.html semaphore 信号量: condition 条件变量: event 同步条件:条件 ...
- Python学习---同步条件event/队列queue1223
写在前面: 在使用这些共享API的时候,我们要注意以下几点: 在UNIX平台上,当某个进程终结之后,该进程需要被其父进程调用wait,否则进程成为僵尸进程(Zombie).所以,有必要对每个Proce ...
- 搞事情 -- python之线程
简介 操作系统线程理论 线程概念的引入背景 线程的特点 进程和线程的关系 使用线程的实际场景 用户级线程和内核级线程(了解) 线程和python 理论知识 线程的创建Threading.Thread类 ...
随机推荐
- Storm概念学习系列之storm出现的背景
不多说,直接上干货! storm出现的背景 互联网从诞生的第一时间起,对世界的最大改变就是让信息能够实时交互,从而大大加速了各个环节的效率.正因为大家有对信息实时响应.实时交互的需求,所以软件行业 ...
- SpringBoot | 第零章:前言
缘起 前段时间公司领导叫编写一两课关于springboot的基础知识培训课程,说实话,也是今年年初才开始接触了SpringBoot这个脚手架,使用了之后才发现打开了一个新世界.再之后也没有一些系统的学 ...
- 傻瓜式的go modules的讲解和代码,及gomod能不能引入另一个gomod和gomod的use of internal package xxxx not allowed
一 国内关于gomod的文章,哪怕是使用了百度 -csdn,依然全是理论,虽然golang的使用者大多是大神但是也有像我这样的的弱鸡是不是? 所以,我就写个傻瓜式教程了. github地址:https ...
- 什么是Spring
之前已经学习过web三层(数据库链接层dao,业务逻辑控制层service,用户层web). 在开发过程中,我们不断引入更加优秀的工具的目的都是在安全.高效的基础上,简化开发,和易于维护. 所以引入s ...
- SpringMVC 返回实体对象时屏蔽某些属性
SpringMVC 可以直接已JSON的结果返回实体对象,可是返回时是所有属性与属性值都会一并返回, 怎样才能屏蔽某些属性?方法很简单,只要在实体对象类中要屏蔽的属性值上加 @JsonIgnore 注 ...
- Day4 HTML新增元素与CSS布局
Day4 HTML新增元素与CSS布局 HTML新增属性: 一:常见的布局标签(都是块级元素) <header>头部</header> <nav>导航</n ...
- 50道CSS基础面试题(附答案)
1 介绍一下标准的CSS的盒子模型?与低版本IE的盒子模型有什么不同的? 标准盒子模型:宽度=内容的宽度(content)+ border + padding + margin低版本IE盒子模型:宽度 ...
- >>我要到处浪系列 之 JS随便投票小脚本
首先郑重声明:我不是对任何网站或者任何个人或组织有意见,仅仅是觉得 4点几 的评分对某些玩票的片段都太高了,为了落实想法,切实履行公民的投票权,并且 bibibabibobi biubiubiu..所 ...
- Eucalyptus-instance启动后查看运行状态
1.前言 在eucalyptus中通过虚拟机模板,创建并启动一个虚拟机,这个时候虚拟机启动正常,但是外部一直无法访问也ping不通,正对这种情况我们如何检查排除问题呢? 两种检查问题的方法: 1).在 ...
- 【Android开发笔记】杂项
Android studio shift+enter : start new line Theme 将 <style name="AppBaseTheme" pare ...