1 concurrent.futures 模块:

# from abc import abstractmethod,ABCMeta
#
# class A(metaclass=ABCMeta):
# def mai(self):
# pass
# @classmethod
# class B(A):
# def mai(self):
# pass # 抽象类----定义子类的一些接口标准 @abstractmethod =================== 进程池 与 线程池 =================== 引入池 的 概念是为了 控制个数 concurrent.futures =======>>> 异步调用 # 1 ====== shutdown(wait=True)====>> close()+join() shutdown(wait=False)=======>> close()
# 2 ====== submit ===>> apply_async()
# 3 ====== map=====
# 4 ======add_done_callback(fn)
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
import time,random,os ===============================计算多的 进程池================================================== # def work(n):
# print('%s is running'%os.getpid())
# time.sleep(random.randint(1,3))
# return n*n
# # 1
# if __name__ == '__main__':
# executor_p=ProcessPoolExecutor(4)
# futures=[]
# for i in range(10):
# future=executor_p.submit(work,i) # 得到异步提交的future对象结果
# futures.append(future)
# executor_p.shutdown(wait=True) # executor_p ==== shutdown
# print('main')
# for obj in futures:
# print(obj.result()) # 结果
#
# # 2 ===== with as
# if __name__ == '__main__':
# with ProcessPoolExecutor(4) as e:
# futures=[]
# for i in range(6):
# future=e.submit(work,i)
# futures.append(future )
# print('Main')
# for obj in futures:
# print(obj.result()) # ================================ 简写 =========================================== # from concurrent.futures import ThreadPoolExecutor
# from threading import current_thread,enumerate,active_count
#
# def work(n):
# print('%s is running'%current_thread())
# return n**2
#
# if __name__ == '__main__':
# with ThreadPoolExecutor() as executor:
# futures=[executor.submit(work,i) for i in range(40)]
#
# for i in futures:
# print(i.result()) ======================================= IO多的 线程池 ===========================
#
# def work(n):
# print('%s is running'%os.getpid())
# time.sleep(random.randint(1,3))
# return n*n
# # 1
# if __name__ == '__main__':
# executor_p=ThreadPoolExecutor(30)
# futures=[]
# for i in range(10):
# future=executor_p.submit(work,i) # 得到异步提交的future对象结果
# futures.append(future)
# executor_p.shutdown(wait=True) # executor_p ==== shutdown
# print('main')
# for obj in futures:
# print(obj.result()) # 结果
#
# # 2 ===== with as
# if __name__ == '__main__':
# with ThreadPoolExecutor(40) as e:
# futures=[]
# for i in range(6):
# future=e.submit(work,i)
# futures.append(future )
# print('Main')
# for obj in futures:
# print(obj.result()) =========================== map ========循环提交 多次结果====================================

# from concurrent.futures import ThreadPoolExecutor
# from threading import current_thread,enumerate,active_count
#
# def work(n):
# print('%s is running'%current_thread())
# return n**2
#
# if __name__ == '__main__':
# with ThreadPoolExecutor() as executor:
# futures=[executor.map(work,range(40))] # [1,2,3,4,5]
# executor.map(work,range(6)) 把后边的可迭代对象当做 参数传给work # ===============================future.add_done_callback(fn)========回调函数=============================================
#
# from concurrent.futures import ProcessPoolExecutor
#
# def work(n):
# return n**n
#
# def work2(m):
# m=m.result()
# print( m/2)
#
# if __name__ == '__main__':
# with ProcessPoolExecutor() as e:
# for i in range(6):
# e.submit(work,i).add_done_callback(work2) #======================future.exeption(4)========等待时间--等待超时异常=============================================

2.事件Event:

   两个进程之间的协同工作
from threading import Event,current_thread,Thread
import time
e=Event() def check():
print('%s 正在检测'%current_thread().getName())
time.sleep(3)
e.set() # 确认设置

def conn():
count=1
while not e.is_set():
if count >3:
raise TimeoutError('连接超时')
print('%s 正在等待连接'%current_thread().getName())
e.wait(timeout=0.1) # 超时时间限制 尝试次数
count+=1
print('%s 正在连接'%current_thread().getName()) if __name__ == '__main__':
t1=Thread(target=check)
t2=Thread(target=conn)
t3=Thread(target=conn)
t4=Thread(target=conn) t1.start()
t2.start()
t3.start()
t4.start()

3.信号量Semaphore:

from threading import Semaphore

信号量 Semaphore ---本质是一把锁======控制同时运行的进程数量(后台可以开启更多的进程)

进程池  ----同时运行的进程数量()

4.-定时器Timer:

# from threading import Timer
#
# def hello():
# print('hello')
#
# t=Timer(4,hello) # Timer--是Thread的子类 4秒后启动
# t.start()

5.死锁现象 递归锁:

============================== 死锁现象 =================================

  递归锁 RLock---可以aquire多次        每aquire一次 计数 加一,只要计数不为一 就不能被其他线程抢到

  互斥锁 ----只能aquire一次

from threading import Thread,Lock,current_thread
import time
mutexA=Lock()
mutexB=Lock() class Mythread(Thread):
def run(self):
self.f1()
self.f2() def f1(self):
with mutexA:
print('%s 抢到了A'%current_thread().getName())
with mutexB:
print('抢到了B'%current_thread().getName())
def f2(self):
with mutexB:
print('抢到了B'%current_thread().getName())
time.sleep(0.1)
with mutexA:
print('抢到了A'%current_thread().getName()) if __name__ == '__main__':
for i in range(6):
t = Mythread()
t.start()

6.线程队列queue:

import queue

q=queue.Queue(4)

q.put(2)
q.put(2)
q.put(2)
q.put(2) print(q.get())
print(q.get())
print(q.get())
print(q.get()) # 1 优先级队列
q=queue.PriorityQueue(3)
q.put((10,'tsd'))
q.put((4,'ard')) # 相同的优先级 比较 后面的数据
q.put((10,'asd')) # 数字越小 优先级越高 print(q.get())
print(q.get())
print(q.get()) # 2 先进后出 ---堆栈 队列

q=queue.LifoQueue(3)

网络编程基础--多线程---concurrent.futures 模块---事件Event---信号量Semaphore---定时器Timer---死锁现象 递归锁----线程队列queue的更多相关文章

  1. 线程使用方法 锁(lock,Rlock),信号了(Semaphore),事件(Event),条件(Ccndition),定时器(timer)

    2线程的使用方法  (1)锁机制       递归锁           RLock()    可以有无止尽的锁,但是会有一把万能钥匙       互斥锁:           Lock()     ...

  2. python并发编程之线程(创建线程,锁(死锁现象,递归锁),GIL锁)

    什么是线程 进程:资源分配单位 线程:cpu执行单位(实体),每一个py文件中就是一个进程,一个进程中至少有一个线程 线程的两种创建方式: 一 from threading import Thread ...

  3. Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures

    参考博客: https://www.cnblogs.com/xiao987334176/p/9046028.html 线程简述 什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线 ...

  4. python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...

  5. Python之线程 3 - 信号量、事件、线程队列与concurrent.futures模块

    一 信号量 二 事件 三 条件Condition 四 定时器(了解) 五 线程队列 六 标准模块-concurrent.futures 基本方法 ThreadPoolExecutor的简单使用 Pro ...

  6. python全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程 什么是线程? 线程是cpu调度的最小单位 进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的 ...

  7. 线程池、进程池(concurrent.futures模块)和协程

    一.线程池 1.concurrent.futures模块 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 Pro ...

  8. concurrent.futures模块

    1.concurrent.futures模块介绍 2.ThreadPoolExecutor线程池使用 3.ProcessPoolExecutor进程池使用 4.其他方法使用 1.concurrent. ...

  9. 创建进程池与线程池concurrent.futures模块的使用

    一.进程池. 当并发的任务数量远远大于计算机所能承受的范围,即无法一次性开启过多的任务数量就应该考虑去 限制进程数或线程数,从而保证服务器不会因超载而瘫痪.这时候就出现了进程池和线程池. 二.conc ...

随机推荐

  1. Overload and Override without Overwrite - Java

    Override(覆盖/覆写): 子类Override父类中的函数(方法).Overload(重载): 同一个类中包含多个同名的函数(方法), 但各个函数的参数列表不同. Override和Overl ...

  2. VC6.0 开发 64 位程序

    1. 设置平台SDK(如:Microsoft platform sdk 2003),选择64位的编译.链接环境. setenv /XP64 /DEBUG 2. 利用这个环境启动VC6.0. msdev ...

  3. mysql插入一张表里的数据到另一张表

    公司的一个项目,做报表--要关联的表结构比较多,最后决定把要用的数据集合到一张新表中,需要用到以下的sql语法......分享下: web开发中,我们经常需要将一个表的数据插入到另外一个表,有时还需要 ...

  4. windows通过ftp下载linux文件

    # windows 下载 linux的文件>> ftp <domain_or_ip>>> <input_username>>> <in ...

  5. 【HackerRank】Coin on the Table

    题目链接:Coin on the Table 一开始想用DFS做的,做了好久都超时. 看了题解才明白要用动态规划. 设置一个三维数组dp,其中dp[i][j][k]表示在时间k到达(i,j)所需要做的 ...

  6. 20145240 《Java程序设计》第一次实验报告

    20145240 <Java程序设计>第一次实验报告 实验内容 一.命令行下java程序开发 1.建立Code目录,输入mkdir 20145240命令建立实验目录,并使用dir命令查看目 ...

  7. debug(实验)

    一.用到的简单的DOS命令: cd\ ——首先要用cd\ 退回到根目录C>下 dir ——显示文件列表 md hb ——建立hb子目录 cd hb ——进入hb子目录 copy d:\dos\m ...

  8. 《深度学习框架PyTorch:入门与实践》的Loss函数构建代码运行问题

    在学习陈云的教程<深度学习框架PyTorch:入门与实践>的损失函数构建时代码如下: 可我运行如下代码: output = net(input) target = Variable(t.a ...

  9. python爬虫-初步认识

    特此声明: 以下内容来源于博主:http://blog.csdn.net/pleasecallmewhy                                     http://cuiq ...

  10. Shell脚本报错--syntax error near unexpected token for((i=0;i<$length;i++))

    现象: shell脚本使用Nodepad++进行本地编辑,在编辑后上传到linux机器进行执行时提示“syntax error near unexpected token for((i=0;i< ...