from threading import Thread
from multiprocessing import Process
import time 计算密集型
def work1():
res=0
for i in range(100000000): #1+8个0
res*=i if __name__ == '__main__':
t_list = []
start = time.time()
for i in range(4):
# t = Thread(target=work1)
t = Process(target=work1)
t_list.append(t)
t.start()
for t in t_list:
t.join()
end = time.time()
# print('多线程',end-start) # 多线程 15.413789510726929
print('多进程',end-start) # 多进程 4.711405515670776 # io密集型
def work1():
x = 1+1
time.sleep(5) if __name__ == '__main__':
t_list = []
start = time.time()
for i in range(4):
t = Thread(target=work1)
# t = Process(target=work1)
t_list.append(t)
t.start()
for t in t_list:
t.join()
end = time.time()
print('多线程',end-start) # 多线程 5.002625942230225
# print('多进程',end-start) # 多进程 5.660863399505615 在Cpython解释器中有一把GIL锁(全局解释器锁),GIl锁本质是一把互斥锁。
导致了同一个进程下,同一时间只能运行一个线程,无法利用多核优势.
同一个进程下多个线程只能实现并发不能实现并行. 为什么要有GIL?
因为cpython自带的垃圾回收机制不是线程安全的,所以要有GIL锁. 导致了同一个进程下,同一时间只能运行一个线程,无法利用多核优势. 分析:
我们有四个任务需要处理,处理方式肯定是要玩出并发的效果,解决方案可以是:
方案一:开启四个进程
方案二:一个进程下,开启四个线程 计算密集型 推荐使用多进程
每个都要计算10s
多线程
在同一时刻只有一个线程会被执行,也就意味着每个10s都不能省,分开每个都要计算10s,共40.ns
多进程
可以并行的执行多个线程,10s多一点,开启进程的时间 io密集型 推荐多线程
4个任务每个任务90%大部分时间都在io.
每个任务io了10s 执行用0.5s
多线程
可以实现并发,每个线程io的时间不咋占用cpu, 10s 加 4个任务的计算时间
多进程
可以实现并行,10s加 1个任务执行的时间+开进程的时间 递归锁内容如下:
from threading import Thread,RLock
# 递归锁 在同一个线程内可以被多次acquire
# 如何释放 内部相当于维护了一个计数器 也就是说同一个线程 acquire了几次就要release几次 mutex1 = RLock()
mutex2 = mutex1 import time
class father(Thread):
def run(self):
self.task1()
self.task2()
def task1(self):
mutex1.acquire()
print(f'{self.name} 抢到了 锁1 ')
mutex2.acquire()
print(f'{self.name} 抢到了 锁2 ')
mutex2.release()
print(f'{self.name} 释放了 锁2 ')
mutex1.release()
print(f'{self.name} 释放了 锁1 ') def task2(self):
mutex2.acquire()
print(f'{self.name} 抢到了 锁2 ')
time.sleep(1)
mutex1.acquire()
print(f'{self.name} 抢到了 锁1 ')
mutex1.release()
print(f'{self.name} 释放了 锁1 ')
mutex2.release()
print(f'{self.name} 释放了 锁2 ') if __name__ == '__main__': for i in range(3):
t = father()
t.start()

最新文章

  1. iOS学习-KVO设计模式
  2. Qt resizeEvent 控件居中设置
  3. HDU 2676 Network Wars 01分数规划,最小割 难度:4
  4. C 中变参函数的处理方式
  5. PLSQL性能优化技巧
  6. 索引查找(索引查找、分块查找) C语言实现
  7. 使用 OpenWrt Image Generator 为 WR703N 路由器定制固件
  8. 物联网 开发板 基于ESP8266
  9. Logstash利用GeoIP库显示地图以及通过useragent显示浏览器(四)
  10. Webservice WCF WebApi
  11. Dubbo Data length too large: 11557050, max payload: 8388608 传输数据超限
  12. ef mysql
  13. MyOD(课下作业,选做)
  14. BashOnWindow安装mysql
  15. Java 对字符串数据进行MD5/SHA1哈希散列运算
  16. websocket发送接收协议
  17. JVM总结-java对象的内存布局
  18. 【bzoj1006】 HNOI2008—神奇的国度
  19. jqGrid删除多行数据问题
  20. JQuery 关于位置的计算(重要)

热门文章

  1. 【Oracle】Oracle ASM管理监控命令
  2. 究极秒杀Loadrunner乱码
  3. 《面试官之你说我听》:简明的图解Redis RDB持久化、AOF持久化
  4. SpringCloud Alibaba微服务实战 - 基础环境准备
  5. Stream系列(六)Match方法使用
  6. .net core 上传文件Demo
  7. springboot打印SQL及多环境配置
  8. 2019-2020-12 20199317 《Linux内核原理与分析》 第十二周作业
  9. 联万物,+智能,为行业,华为云升级OceanConnect IoT全栈云服务
  10. 华为担纲建设基础软硬件国家新一代AI开放创新平台