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. SaltStack远程执行shell脚本

    编辑文件fansik.sh 脚本内容: #!/bin/bash # Author: fansik # data: 2017年 09月 26日 星期二 :: CST touch /tmp/fansik. ...

  2. 3.3 使用STC89C52控制MC20通过GPRS远程发送数据

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  3. staticmethod

    python staticmethod 返回函数的静态方法. 该方法不强制要求传递参数,如下声明一个静态方法: class C(object): @staticmethod def f(arg1, a ...

  4. MySQL数据库(5)_MySQL数据库视图、触发器

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( S ...

  5. The Maximum Unreachable Node Set 【17南宁区域赛】 【二分匹配】

    题目链接 https://nanti.jisuanke.com/t/19979 题意 给出n个点 m 条边 求选出最大的点数使得这个点集之间 任意两点不可达 题目中给的边是有向边 思路 这道题 实际上 ...

  6. asp.net,关于Listview+DataPager控件使用

    关于Listview+DataPager控件使用1.DAL层,根据开始条数+结束条数查询数据.2.BLL层,startRowIndex和maximumRows进行查询.(startRowIndex + ...

  7. python 课堂笔记-if语句

    # Author:zyl _username = 'zyl' _password = 'zyl123' username = input("username:") password ...

  8. Shell编程之循环控制及状态返回值

    1.break.continue.exit.return的对比 break.continue在条件语句和循环语句中用于控制程序走向: exit用于终止所有语句并退出当前脚本,还可以返回上一次程序或命令 ...

  9. Apache的order、allow、deny

    Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directory, Location, Files等),用来控制目录和文件的访问授权. 所以,最常用的是:Or ...

  10. Ubuntu登陆不进去(已解决)【转】

    本文转载自:https://blog.csdn.net/u010925447/article/details/72236387 Ubuntu一直在登陆界面循环:登陆密码是正确的,但是登陆后自动退回登陆 ...