1、死锁

```# -*-coding:utf-8 -*-
import time
muxeA=Lock()
muxeB=Lock()

def run(self):
self.func1()
self.func2()

def func1(self):
muxeA.acquire()
print('%s抢到A锁了'%self.name)
muxeB.acquire()
print('%s抢到B锁了' % self.name)
muxeB.release()
muxeA.release()

def func2(self):
muxeB.acquire()
print('%s抢到B锁了' % self.name)
time.sleep(2)
muxeA.acquire()
print('%s抢到A锁了' % self.name)
muxeA.release()
muxeB.release()

if __name__ == '__main__':
for i in range(10):
t.start()```
``````分析：

```执行结果如下：```

2、递归锁：

`递归锁使用：from reading import RLock`

1、可以被连续的acquire和release
2、但是，只能第一个抢到这把锁执行上述操作
3、它内部有一个计数器，每acquire一次计数加一，每realse一次计数减一
4、只要计数不为0，那么其他人都无法抢到该锁

```# -*-coding:utf-8 -*-
import time

muxeA=muxeB=RLock()

def run(self):
self.func1()
self.func2()

def func1(self):
muxeA.acquire()
print('%s抢到A锁了'%self.name)
muxeB.acquire()
print('%s抢到B锁了' % self.name)
muxeB.release()
muxeA.release()

def func2(self):
muxeB.acquire()
print('%s抢到B锁了' % self.name)
time.sleep(2)
muxeA.acquire()
print('%s抢到A锁了' % self.name)
muxeA.release()
muxeB.release()

if __name__ == '__main__':
for i in range(10):
t.start()```

3、信号量：

```from threading import Thread,Semaphore
import time,random
s=Semaphore(5)

s.acquire()
print('%s号停车位正在停车'%name)
time.sleep(random.randint(1,5))
s.release()

if __name__ == '__main__':
for i in range(10):
t.start()```

4、事件

```from threading import Thread,Event
import time,random
event=Event()
def light():
print("红灯")
time.sleep(3)
print('绿灯')
event.set() #发送信号

def car(name):
print('%s车正在等红灯'%name)
event.wait()  #等待对方发信号过来
print('%s车过绿灯'%name)

if __name__ == '__main__':
t.start()
for i in range(10):
t1.start()```

5、线程池、进程池：

```#线程池的创建：
#括号内为线程池中进程的个数，你可以自己设置，默认是5个，最大不会超过32个
max_workers = min(32, (os.cpu_count() or 1) + 4)

#进程池的创建：
pool=ProcessPoolExecutor()
#它的参数如下：os.cpu_count()表示电脑的CPU核数
self._max_workers = os.cpu_count() or 1

pool=ProcessPoolExecutor()

```# -*-coding:utf-8 -*-
import time,os

pool=ProcessPoolExecutor()

def call_back(n):
print(">>:",n.result())
print(n,os.getpid())
time.sleep(2)
return n*n

if __name__ == '__main__':
# list_pool=[]
for i in range(10):

6、协程、gevent模块：

gevent模块的使用需要打猴子补丁，不然不会检测到像time.sIeep()等O操作

```#猴子补丁
from gevent import monkey
monkey.patch_all()```

```# -*-coding:utf-8 -*-
#猴子补丁
from gevent import monkey
monkey.patch_all()

from gevent import spawn
import time

def ha():
print('hahaha')
time.sleep(2)
print('hahaha')

def xixi():
print('xixi')
time.sleep(3)
print('xixi')

if __name__ == '__main__':
start_time=time.time()
g1=spawn(ha)
g2=spawn(xixi)
g1.join()
g2.join()
print(time.time()-start_time)```

7、基于协程的TCP并发：

``` # -*-coding:utf-8 -*-
#猴子补丁
from gevent import monkey;monkey.patch_all()

from gevent import spawn
import socket

server=socket.socket()
server.listen(5)
while True:
spawn(connect,conn)

def connect(conn):
while True:
try:
data=conn.recv(1024)
print(data.decode())
if len(data)==0:break
conn.send(data.upper())
except Exception as e:
print(e)
break
if __name__ == '__main__':
g1=spawn(new_server,'localhost',8080)
g1.join()```

``` # -*-coding:utf-8 -*-
import socket

def new_client():
c=socket.socket()
c.connect(('localhost',8080))
while True:
c.send(data.encode())
data1=c.recv(1024)
print(data)

if __name__ == '__main__':
for i in range(200):
t.start()```

并发编程中死锁、递归锁、进程/线程池、协程TCP服务器并发等知识点的更多相关文章

1. Java 并发编程中的 Executor 框架与线程池

Java 5 开始引入 Conccurent 软件包,提供完备的并发能力,对线程池有了更好的支持.其中,Executor 框架是最值得称道的. Executor框架是指java 5中引入的一系列并发库 ...

1. 概述 1.1 什么是线程池 与jdbc连接池类似,在创建线程池或销毁线程时,会消耗大量的系统资源,因此在java中提出了线程池的概念,预先创建好固定数量的线程,当有任务需要线程去执行时,不用再去 ...

3. Java并发编程：Java的四种线程池的使用，以及自定义线程工厂

4. python进程.线程和协程的总结

5. python并发编程之多进程、多线程、异步、协程、通信队列Queue和池Pool的实现和应用

什么是多任务? 简单地说,就是操作系统可以同时运行多个任务.实现多任务有多种方式,线程.进程.协程. 并行和并发的区别? 并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任 ...

6. python-GIL、死锁递归锁及线程补充

一.GIL介绍 GIL全称 Global Interpreter Lock ,中文解释为全局解释器锁.它并不是Python的特性,而是在实现python的主流Cpython解释器时所引入的一个概念,G ...

7. python并发编程-进程池线程池-协程-I/O模型-04

目录 进程池线程池的使用***** 进程池/线程池的创建和提交回调 验证复用池子里的线程或进程 异步回调机制 通过闭包给回调函数添加额外参数(扩展) 协程*** 概念回顾(协程这里再理一下) 如何实现 ...

8. 【java并发编程实战】第八章：线程池的使用

9. 并发编程（十二）—— Java 线程池 实现原理与源码深度解析 之 submit 方法 （二）

10. Java并发编程（三）什么是线程池

什么是线程池 学习编程的小伙伴们会经常听到“线程池”.“连接池”这类的词语,可是到底“池”是什么意思呢?我讲个故事大家就理解了:在很久很久以前有一家银行,一年之中只有一个客户来办理业务,随着时间的推移 ...

随机推荐

1. python安装第三方类库的方法

1.先到官网 http://pypi.python.org/pypi/setuptools 下载setuptools.exe文件并安装 点击 ez_setup.py进入, 并将内容复制下来, 保存为本 ...

2. 搭建基于Jenkins salt-api的运维工具

1. 安装salt-master和salt-minion 安装过程不再赘述,请参考http://docs.saltstack.com/en/latest/topics/installation/ind ...

3. juqery easyui

私人做程序开发一直有个头疼的问题就是后台管理界面,以前一般都是自己用jquery+ps自己设计的,效果很一般,很不理想. 今天初次使用Jquery EasyUi,简单的做了个布局页面感觉还不错,给大家 ...

4. .NET Core 工具从 project.json 移动到基于 MSBuild 的项目后的使用

.NET Core 从preview 4 开始弃用project.json 可以从这下载最新版本: https://github.com/dotnet/cli 使用VS2017 RC新建.net co ...

<?php session_start(); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//E ...

6. [__NSCFString absoluteURL]错误的解决方案

Xcode提醒错误: -[__NSCFString absoluteURL]: unrecognized selector sent to instance 0x8c4d3a0 *** Termina ...

7. input file样式修改，图片预览删除功能

本篇对input file进行了修改,改成自己需要的样式,类似验证身份上传身份证图片的功能. 效果图如下: 这里主要展示上传预览图片功能,对于删除功能的html及css写的比较粗糙,对于想要精细表现这 ...

8. 《ASP.NET Core In Action》读书笔记系列五 ASP.NET Core 解决方案结构解析1

创建好项目后,解决方案资源管理器窗口里我们看到,增加了不少文件夹及文件,如下图所示: 在解决方案文件夹中,找到项目文件夹,该文件夹又包含五个子文件夹 -Models.Controllers.Views ...

9. Python利用脚本2.x到3自动转换

本文介绍一下在windows 10 环境下如何使用这个工具: 1)首先要先安装好python3,可到官网下载https://www.python.org/ 2)使用Windows 命令提示符(cmd) ...

10. LFCS 系列第八讲：管理用户和用户组、文件权限和属性以及启用账户 sudo 访问权限

由于 Linux 是一个多用户的操作系统(允许多个用户通过不同主机或者终端访问一个独立系统),因此你需要知道如何才能有效地管理用户:如何添加.编辑.禁用和删除用户账户,并赋予他们足以完成自身任务的必要 ...