1,内容回顾

# 正确的学习方法# input# output# correct 纠正# 线程# 线程是进程中的执行单位# 线程是cpu执行的最小单位# 线城之间资源共享# 线程的开启和关闭以及切换的时间开销远远小于进程# 线程本身可以在同一时间使用多个cpu
# python 与 线程# Cpython解释器在解释代码过程中容易产生数据不安全的问题# GIL 全局解释器锁 锁的是线程
# threading

2,守护线程

import time
from threading import Thread
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('主线程')# 守护进程随着主进程代码的执行结束而结束
# 守护线程会在主线程结束之后等待其他子线程的结束才结束# 主进程在执行完自己的代码之后不会立即结束 而是等待子进程结束之后 回收子进程的资源
# import time
# from multiprocessing import Process
# def func():
#     time.sleep(5)
#
# if __name__ == '__main__':
#         Process(target=func).start()

3,线程锁

import time
from threading import Lock,Thread
# Lock 互斥锁
# 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)# 科学家吃面# noodle_lock  = Lock()
# fork_lock = Lock()
# 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):
#     fork_lock.acquire()
#     print('%s拿到叉子了'%name)
#     time.sleep(1)
#     noodle_lock.acquire()
#     print('%s拿到面条啦'%name)
#     print('%s吃面'%name)
#     noodle_lock.release()
#     fork_lock.release()
#
# Thread(target=eat1,args=('alex',)).start()
# Thread(target=eat2,args=('Egon',)).start()
# Thread(target=eat1,args=('bossjin',)).start()
# Thread(target=eat2,args=('nezha',)).start()from threading import RLock   # 递归锁
fork_lock = noodle_lock  = RLock()   # 一个钥匙串上的两把钥匙
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):fork_lock.acquire()print('%s拿到叉子了'%name)time.sleep(1)noodle_lock.acquire()print('%s拿到面条啦'%name)print('%s吃面'%name)noodle_lock.release()fork_lock.release()Thread(target=eat1,args=('alex',)).start()
Thread(target=eat2,args=('Egon',)).start()
Thread(target=eat1,args=('bossjin',)).start()
Thread(target=eat2,args=('nezha',)).start()

4,信号量

import time
from threading import Semaphore,Thread
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()

5,事件

# 事件被创建的时候
# False状态# wait() 阻塞
# True状态# wait() 非阻塞
# clear 设置状态为False
# set  设置状态为True#  数据库 - 文件夹
#  文件夹里有好多excel表格# 1.能够更方便的对数据进行增删改查# 2.安全访问的机制#  起两个线程
#  第一个线程 : 连接数据库# 等待一个信号 告诉我我们之间的网络是通的# 连接数据库
#  第二个线程 : 检测与数据库之间的网络是否连通# time.sleep(0,2) 2# 将事件的状态设置为True
import time
import random
from threading import Thread,Event
def connect_db(e):count = 0while count < 3:e.wait(0.5)   # 状态为False的时候,我只等待1s就结束if e.is_set() == True:print('连接数据库')breakelse:count += 1print('第%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()

6,条件

# 条件
from threading import Condition# 条件
# 锁
# acquire release
# 一个条件被创建之初 默认有一个False状态
# False状态 会影响wait一直处于等待状态
# notify(int数据类型)  造钥匙
from threading import Thread,Condition
def func(con,i):con.acquire()con.wait() # 等钥匙print('在第%s个循环里'%i)con.release()
con = Condition()
for i in range(10):Thread(target=func,args = (con,i)).start()
while True:num = int(input('>>>'))con.acquire()con.notify(num)  # 造钥匙con.release()

7,定时器

import time
from threading import Timer
def func():print('时间同步')   #1-3while True:t = Timer(5,func).start()   # 非阻塞的time.sleep(5)

8,队列

# queue
import queueq = queue.Queue()  # 队列 先进先出
# q.put()
# q.get()
# q.put_nowait()
# q.get_nowait()# 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'))
q.put((-5,'d'))
q.put((1,'?'))
print(q.get())

9,线程池

import time
from concurrent.futures import ThreadPoolExecutor
def func(n):time.sleep(2)print(n)return n*ndef call_back(m):print('结果是 %s'%m.result())tpool = ThreadPoolExecutor(max_workers=5)   #  默认 不要超过cpu个数*5
for i in  range(20):tpool.submit(func,i).add_done_callback(call_back)# tpool.map(func,range(20))  # 拿不到返回值
# 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())# ftp
# 并发编程

Python笔记day40(并发)|守护线程、线程锁、信号量、事件、条件、定时器、队列、线程池相关推荐

  1. 线程的创建 锁 Threading模块 事件 条件 定时器 队列 线程池 回调函数

    线程的创建: 创建线程的方式1: from threading import Thread import time def sayhi(name):time.sleep(2)print('%s say ...

  2. 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)...

    参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...

  3. 网络编程9_线程-条件,定时器,队列,线程池, 协程

    线程 一. 条件     使得线程等待,只有满足某条件时,才释放n个线程     import time     from threading import Thread,RLock,Conditio ...

  4. python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型))...

    昨日内容回顾 python中启动子进程 并发编程 并发 :多段程序看起来是同时运行的 ftp 网盘 不支持并发 socketserver 多进程 并发 异步 两个进程 分别做不同的事情 创建新进程 j ...

  5. day034 锁,信号量,事件,队列,子进程与子进程通信,生产者消费者模型,joinableQueue...

    进程锁 #加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全. 虽然可以用文件共享数据实现进程间通信,但问题是: 1 ...

  6. 进程锁、事件、进程队列、进程间共享数据、生产者消费者模型

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 进程锁(Lock) 锁的基本概念 锁的基本用法 模拟12306抢票软件 信号量:Semaphone 概念 Semaphore ...

  7. Python笔记_第四篇_高阶编程_进程、线程、协程_5.GPU加速

    Numba:高性能计算的高生产率 在这篇文章中,笔者将向你介绍一个来自Anaconda的Python编译器Numba,它可以在CUDA-capable GPU或多核cpu上编译Python代码.Pyt ...

  8. C++多线程 互斥锁 信号量 事件 临界区

    一.互斥锁 1.先熟悉熟悉API 1,创建互斥锁,并反正一个句柄 HANDLE CreateMutex( LPSECURITY_ATTRIBUTESlpMutexAttributes, // 指向安全 ...

  9. 【并发】线程同步——锁Lock与synchronized比较

    一.简单使用Lock锁 Java 5中引入了新的锁机制--java.util.concurrent.locks中的显式的互斥锁:Lock接口,它提供了比synchronized更加广泛的锁定操作.Lo ...

最新文章

  1. 给自己提个醒:关于document.getElementsByName无法获取非表单元素
  2. LeetCode Single Number
  3. 更新pip到指定版本
  4. 为梦想而战,高考励志主题教育班会PPT
  5. 【实施工程师】Linux安装Windows软件:微信、QQ、TIM
  6. 通向财务自由之路06_适应大环境的交易策略
  7. 2018 蓝桥杯省赛 B 组模拟赛(一)I. 天上的星星(二维前缀和)
  8. HeadFirst设计模式之命令模式
  9. 修改strut默认的action后缀
  10. win10 如何做到 C盘 的绝对干净,所有软件都安装到D盘,C盘只用来存操作系统。
  11. 2016首次CCCC总结
  12. vidda系统+android系统,海信电视精简教程,去除电视多余应用,换桌面!
  13. 广义瑞利商_瑞利商定义和广义瑞利商
  14. 基于SSM的美容院管理系统
  15. 【python】Flask-SQLAlchemy的Lost connection问题
  16. github whs_从iPhone或iPod Touch获得WHS的基本访问权限,而无需安装应用程序
  17. 用谷歌还是火狐?手机端还是另外选择其他浏览器吧
  18. 电子警察位置【收藏】
  19. python 截取图片中的一部分并且复制到另一张图片中 (任意角度旋转)
  20. NLP | 深入浅出word2vec

热门文章

  1. Python切片练习
  2. nuiapp请求网络_uni-app 页面配置和跳转(一)
  3. 从0到1入门STM32最小系统板(2-1)——绘制原理图之器件选型
  4. 【愚公系列】2023年04月 wireshark系列-数据抓包分析之之恶意流量FTP
  5. 【机器学习】什么是过度拟合?如何解决过度拟合?
  6. SAP-QM检验结果记录-定量超过限定范围为什么还是评估为通过?
  7. 最多跑一次,数字化政府,和 CloudFoundry
  8. Jquery实现仿腾讯微薄的广播发表
  9. 创造一个“超长待机”的世界,我们离不开“锂”
  10. 谁说菜鸟不会数据分析python pdf_谁说菜鸟不会数据分析spss