一.多进程

当计算机运行程序时,就会创建包含代码和状态的进程。这些进程会通过计算机的一个或多个CPU执行。不过,同一时刻每个CPU只会执行一个进程,然后不同进程间快速切换,给我们一种错觉,感觉好像多个程序在同时进行。例如:有一个大型工厂,该工厂负责生产电脑,工厂有很多的车间用来生产不同的电脑部件。每个车间又有很多工人互相合作共享资源来生产某个电脑部件。这里的工厂相当于一个爬虫工程,每个车间相当于一个进程每个工人就相当于线程线程是CPU调度的基本单元。

也就是进程间是独立的,这表现在内存空间,上下文环境;而线程运行在进程空间内.也就是同一进程产生的线程共享同一内存空间.

需要注意的是单核CPU系统中,真正的并发是不可能的.

1.顺序执行

2.多进程并发 注意除了时间的加速意外也要看看函数返回值的写法,带有多进程的map,是返回一个列表

import requests
import re
import time
from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool
def spyder(url):# res = []res = {'init:':'hello'}print('hahah:{}'.format(url))time.sleep(1)# res.append(url)res.update({'entr:'+url:url})return resdef use_process():urls = ["https://www.qiushibaike.com/text/page/{}/".format(str(i)) for i in range(0, 4)]start_1 = time.time()#获取函数返回结果res1 = []for url in urls:res_ = spyder(url)res1.append(res_)end_1 = time.time()print("单进程:", end_1 - start_1)print('res1:', res1)# 获取函数返回结果#  进程池start_2 = time.time()pool = Pool(processes=2)res2 = pool.map(spyder, urls)pool.close()pool.join()print('res2:', res2)end_2 = time.time()print("2进程:", end_2 - start_2)# 获取函数返回结果# 进程池start_3 = time.time()pool = Pool(processes=4)res3 = pool.map(spyder, urls)pool.close()pool.join()print('res2:', res3)end_3 = time.time()print("4进程:", end_3 - start_3)
if __name__ == "__main__":use_process()

二.多线程

实际上由于GIL(全局解释器锁)的限制,哪个线程想要执行代码就需要去申请锁,否则只能等着,所以这个锁阻碍了真正的多线程并发,这是解释器cpython的锅,一般不推荐用多线程,而是用多进程multiprocess来绕过GIL.

2.1 thread多线程

import time
import _thread
from threading import Thread
# 使用线程锁,防止线程死锁
mutex = _thread.allocate_lock()
def test(d_num):d_num.append(89)print("test: %s"% str(d_num))
def test1(d_num):print("test1: %s"% str(d_num))
def main():d_num = [100, 58]t1 = Thread(target=test, args=(d_num,))t2 = Thread(target=test1, args=(d_num,))t1.start()time.sleep(1)t2.start()time.sleep(1)if __name__ == '__main__':main()

2.2 多线程队列版

import time
import _thread
from threading import Thread
import queue
# 使用线程锁,防止线程死锁
mutex = _thread.allocate_lock()
frame_queue = queue.Queue()
def test(d_num):print("test: %s" % str(d_num))for i in range(d_num):frame_queue.put(i)def test1():while 1:if frame_queue.empty() != True:# 从队列中取出图片value = frame_queue.get()print('==value:', value)time.sleep(1)else:break
def main():d_num = 10t1 = Thread(target=test, args=(d_num,))t1.start()t2 = Thread(target=test1)t2.start()if __name__ == '__main__':main()

2.3 注意传参与多进程的区别,线程池

from functools import partial
from itertools import repeat
from multiprocessing import Pool, freeze_supportdef func(a, b):return a + bdef main():a_args = [1, 2, 3]second_arg = 1with Pool() as pool:L = pool.starmap(func, [(1, 1), (2, 1), (3, 1)])print('L:', L)M = pool.starmap(func, zip(a_args, repeat(second_arg)))print('M:', M)N = pool.map(partial(func, b=second_arg), a_args)print('N:', N)
main()

import requests
import re
import time
from multiprocessing import Pool
from multiprocessing.dummy import Pool as ThreadPool
def spyder(url):# res = []res = {'init:':'hello'}print('hahah:{}'.format(url))time.sleep(1)# res.append(url)res.update({'entr:'+url:url})return resdef use_process():urls = ["https://www.qiushibaike.com/text/page/{}/".format(str(i)) for i in range(0, 4)]start_1 = time.time()#获取函数返回结果res1 = []for url in urls:res_ = spyder(url)res1.append(res_)end_1 = time.time()print("单进程:", end_1 - start_1)print('res1:', res1)# 获取函数返回结果#  进程池start_2 = time.time()pool = Pool(processes=2)res2 = pool.map(spyder, urls)pool.close()pool.join()print('res2:', res2)end_2 = time.time()print("2进程:", end_2 - start_2)# 获取函数返回结果# 进程池start_3 = time.time()pool = Pool(processes=4)res3 = pool.map(spyder, urls)pool.close()pool.join()print('res2:', res3)end_3 = time.time()print("4进程:", end_3 - start_3)def use_threadpool():urls = [["https://www.qiushibaike.com/text/page/{}/".format(str(i))] for i in range(0, 4)]print('urls:', urls)# 线程池start = time.time()pool = ThreadPool(processes=4)res = pool.starmap(spyder, urls)pool.close()pool.join()end = time.time()print('res:', res)print("4线程:", end - start)
if __name__ == "__main__":# use_process()use_threadpool()

实际应用将图片路径和名字传入,用zip方式打包传参

import osimport cv2
import time
import itertools
from multiprocessing.dummy import Pool as ThreadPoolSIZE = (75,75)
SAVE_DIRECTORY='thumbs'
def save_img(filename,save_path):save_path+= filename.split('/')[-1]im = cv2.imread(filename)im=cv2.resize(im,SIZE)cv2.imwrite(save_path,im)if __name__ == '__main__':path='./data/testlabel'print(path)output_path='./data/thumbs/'if not os.path.exists(output_path):os.mkdir(output_path)print(output_path)imgs_list_path=[os.path.join(path,i) for i in os.listdir(path)]print(len(imgs_list_path))start_time=time.time()pool = ThreadPool(processes=8)print(list(zip(imgs_list_path,[output_path]*len(imgs_list_path))))pool.starmap(save_img,zip(imgs_list_path,[output_path]*len(imgs_list_path)))pool.close()pool.join()end_time=time.time()print('use time=',end_time-start_time)

python多进程并发与pool多线程相关推荐

  1. python php multiprocessing,Python多进程并发(multiprocessing)用法实例详解

    本文实例讲述了Python多进程并发(multiprocessing)用法.分享给大家供大家参考.具体分析如下: 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU ...

  2. python 多进程并发与多线程并发总结

    本文对python支持的几种并发方式进行简单的总结. Python支持的并发分为多线程并发与多进程并发(异步IO本文不涉及).概念上来说,多进程并发即运行多个独立的程序,优势在于并发处理的任务都由操作 ...

  3. python多进程并发代码_Python并发编程系列之多进程(multiprocessing)

    1引言 本篇博文主要对Python中并发编程中的多进程相关内容展开详细介绍,Python进程主要在multiprocessing模块中,本博文以multiprocessing种Process类为中心, ...

  4. python 多进程并发_python并发编程之多进程

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

  5. python 多进程并发 阻塞_python并发编程多进程(一)

    一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): 爱根儿老师在一个时间段内有很多任务要做:python备课的任务,写书的 ...

  6. python 多进程并发 阻塞_python并发编程之多进程理论部分

    一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): egon在一个时间段内有很多任务要做:python备课的任务,写书的任 ...

  7. python 多进程并发(进程池)

    前言 最近在处理大数据相关的东西,数据动辄上百万,还不能用 GPU 加速,于是开始动起了多进程的念头.众所周知,Python 的多线程是假的,不过好在开发者老大还是给我们留了一个活路,也就是进程池.这 ...

  8. 27.Linux网络编程 掌握三次握手建立连接过程掌握四次握手关闭连接的过程掌握滑动窗口的概念掌握错误处理函数封装实现多进程并发服务器实现多线程并发服务器

    基本概念叫协议 什么叫协议? 协议是一个大家共同遵守的一个规则, 那么在这个网络通信当中,其实就是双方通信和解释数据的一个规则,这个概念 你也不用记,你只要心里明白就可以了, 分层模型, 物数网传会表 ...

  9. python多进程并发接口_python-并发编程之多进程

    一.操作系统基础: 进程的概念起源于操作系统,操作系统其它所有概念都是围绕进程来的,所以我们了解进程之前先来了解一下操作系统 操作系统位于计算机硬件与应用软件之间,本质也是一个软件.操作系统由操作系统 ...

最新文章

  1. Greenplum介绍
  2. 五大原则之----里氏替换原则(LSP)
  3. make: *** 没有规则可制作目标“distclean”。 停止。_Makefile伪目标
  4. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 8丨平面上的最近距离【难度中等】
  5. java2的7次方怎么表示_一元二次方程常见题型之方程根的解法
  6. Web前端前景、最新技术、学习路线?
  7. 根据第xx天推算日期
  8. 微信支付phpv3给我们留下的坑
  9. 大刀阔斧,抽丝剥茧:评红黑树系列文章
  10. Mac下host管理工具
  11. 抖音被“逼”出个“视频朋友圈”
  12. redis 五大数据类型
  13. 最有效的一种技术领导是“以身作则”
  14. html导航页面转换,纯CSS实现导航栏Tab切换效果
  15. 苹果沙盒服务器验证,我收到21004的状态值回复来自苹果的沙盒测试服务器自动再生订阅的IOS?(I'm gett...
  16. Echarts-gl geo3D设置regions区域高度
  17. python核心编程-Amy老师第十二讲作业内容
  18. TodoList反选
  19. 全自动细菌菌落计数器
  20. 解析旅游商业模式---共享旅游电商:这个行业大有可为!

热门文章

  1. PAT乙类1014 福尔摩斯的约会 (20 分)
  2. 大众点评账号业务高可用进阶之路
  3. 论文浅尝 | 基于知识库的类型实体和关系的联合抽取
  4. pip加速+百度镜像|清华镜像
  5. 图的遍历——深度优先搜索+广度优先搜索
  6. 18 操作系统第五章 设备管理 IO设备的基本概念和分类 IO控制器 IO控制方式 IO软件层次结构 IO核心子系统 假脱机技术 设备的分配与回收 缓冲区管理
  7. 现在早上起来都还是感觉颈椎有些通
  8. 背景和弹出 Panel 都带有动画效果的 modal 效果
  9. 【计算机网络复习】1.2.2 OSI参考模型
  10. (转)Windows系统、Linux系统 和 Mac OS操作系统 历史由来 与 区别?