python多进程并发+pool多线程+共享变量

一.多进程

当计算机运行程序时,就会创建包含代码和状态的进程。这些进程会通过计算机的一个或多个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)

三.共享变量 

import numpy as np
from multiprocessing import shared_memory
from multiprocessing import Process
from multiprocessing.managers import SharedMemoryManager
import time
import glob
import os
import shutilsmm = SharedMemoryManager()
smm.start()
screen_img = np.zeros((480, 640, 3), dtype=np.uint8)
share_screen_img = smm.SharedMemory(screen_img.nbytes)def change(name):a = np.array([0, 0, 0, 0, 0, 0])existing_shm = shared_memory.SharedMemory(name=name)b = np.ndarray((6, ), dtype=np.int64, buffer=existing_shm.buf)b[:] = a[:]print("changed")def show(name):while True:existing_shm = shared_memory.SharedMemory(name=name)show_img = np.ndarray((480, 640, 3),dtype=np.uint8,buffer=existing_shm.buf)print('show_img:', show_img.sum())time.sleep(0.30)if __name__ == '__main__':tmp = np.ndarray(screen_img.shape,dtype=screen_img.dtype,buffer=share_screen_img.buf)print('init tmp:', tmp.sum())# p1 = Process(target=change, args=(sm.name, ))p2 = Process(target=show, args=(share_screen_img.name, ))p2.start()time.sleep(2)tmp[:] = np.ones((480, 640, 3), dtype=np.uint8)# p1.join()# print('final b:', b)p2.join()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高通骁龙855发布,5G大幕拉开,新一轮手机大战在即

来源:网易智能摘要:高通终于公布下一代移动芯片骁龙855。美国时间12月4日,高通在美国夏威夷召开了第三届高通骁龙技术峰会,在峰会首日,骁龙855正式发布。并非外界传言的8150,高通还是沿用了之前的命名规则。…

机器学习的几种方法(knn,逻辑回归,SVM,决策树,随机森林,极限随机树,集成学习,Adaboost,GBDT)

一.判别模式与生成模型基础知识 举例:要确定一个瓜是好瓜还是坏瓜,用判别模型的方法是从历史数据中学习到模型,然后通过提取这个瓜的特征来预测出这只瓜是好瓜的概率,是坏瓜的概率。 举例:利用生成模型是根据好瓜的特…

京东物联网战略大升级|与华为合作,疯狂发布新品,“养鱼”的京东正在物联网赛道上花式秀技术...

来源:物联网智库12月4日下午,在“智联万物 新响无限”2018年京东IoT战略发布会上,京东发布了其IoT领域的最新战略规划,推出了新的品牌“京鱼座”,还推出一系列合作品牌与硬件产品,该战略不仅是对去年5月9日…

电动车的惊世骗局

来源:世界科技创新论坛摘要:新能源是一个很好的机会,技术也没有瓶颈,如果发展对了方向,十年扶持一两个世界领先水平的企业是没问题的。但如果有人趁机“钻空子”,让有限的资源被浪费,怕是很难有…

语义分割中的类别不平衡的权重计算

这是5幅图,加上背景共5类。 可以参考这篇文章https://blog.csdn.net/u012426298/article/details/81232386 对于一个多类别图片数据库,每个类别都会有一个class frequency, 该类别像素数目除以数据库总像素数目, 求出所有class frequency 的median 值&…

盘点百度、阿里、腾讯、华为自动驾驶战略

来源:智车科技摘要:本文中盘点了百度、阿里、腾讯、华为四家巨头的自动驾驶事迹,以及从车路协同、车联网、高精度地图等方面对四家公司进行了梳理。今年阿里9 月云栖大会、华为10 月全联接大会、百度11 月世界大会、腾讯11 月合作伙伴大会可以…

计算机行业2019年度投资研究手册

来源:乐晴智库精选摘要:计算机服务于各行各业,担当各下游需求行业的重要工具,在技术上游电子元器件和通信的技术变迁中,计算机企业结合客户需求不断进行技术和模式创新以获取源源不断的成长动力。2014-2015年在4G及移动…

scikit-learn流形学习手写数字可视化

本文参考如下链接: https://www.jianshu.com/p/2542e0a5bdf8 from time import time import cv2 import numpy as np import matplotlib.pyplot as plt from matplotlib import offsetbox from sklearn import (manifold, datasets, decomposition, ensemble,disc…

世界上手速最快的仿人机器人诞生在韩国!魔术师也要失业了!

来源:机器人创新生态虽然夏天都过去了这么久,但谁能想到小编竟然还能深受蚊子的骚扰~~这只蚊子真的是很强啊,为了消灭这些蚊子,小编特意进口了一款专用的“拍蚊子机器人”经过小编亲自测试,这款机器人拍蚊子效果非常不…

从人工智能到物联网……这些公司如何改变农业与食品工业

来源:资本实验室目前,全球农业与食品工业产值约7.8万亿美元,占全球15%以上的GDP,并且雇佣了超过40%的人口。然而,农业与食品产业正面临着一些新的问题亟待解决,其中包括:消费者偏好和需求存在多…

pandas分析各国家交易情况

数据集来源: https://archive.ics.uci.edu/ml/datasets/Online%20Retail #coding:utf-8import pandas as pd import os import seaborn as sns import matplotlib.pyplot as pltRAW_DATA_FILE ./data/online_retail.xlsx CLN_DATA_FILE ./output/cln_online_ret…

Gartner 2019基础设施和运维十大趋势:Serverless、边缘计算、SaaS 变复杂等

来源:机器之心Gartner公司强调了基础设施和运维(I&O)领导者在2019年必须开始准备迎接的几大技术和趋势,以便支持数字化基础设施。Gartner的分析师们在Gartner IT基础设施、运维和云战略大会上介绍了研究结果。Gartner的高级研究主任罗斯•温瑟(Ross …

天池入门赛--蒸汽预测

首先查看数据 #coding:utf-8 """ Created on Wen Jan 9 2019author: fzh """ import warnings warnings.filterwarnings("ignore") import matplotlib.pyplot as plt plt.rcParams.update({figure.max_open_warning: 0}) import sea…

脑科学与AI要想融合发展,目前来说仍很困难

来源:人机与认知实验室摘要:AI要想进一步发展,需要从脑科学得到启发。业界普遍认为,AI未来的演进方向就是计算智能、感知智能和认知智能,在此期间,真正需要突破的就是让计算机理解、思考和进行自我学习&…

张首晟生前重磅演讲:要用第一性原理的思维方式来理解今天的世界

来源:经济学家圈摘要:本文为华裔科学家张首晟今年3月25日在IT领袖峰会上的演讲以下是张首晟教授演讲全文:谢谢大家的关注,在下午来听我的分享,今天大会是IT领袖峰会,所以我想讲的三个题目是「量子计算」、「…

Windows live writer插入代码图片Test

/*** 验证字符串text是不是ip地址,是返回true,否则返回false* param text* return*/ public static boolean isIPAddress(String text){StringBuilder regex new StringBuilder("^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."); regex.a…

knn用于水果数据集分类

数据集地址:https://download.csdn.net/download/fanzonghao/10940440 knn算法流程: 若k取无穷大,那么测试数据就取决于每一类的占比,归属于占比最大的那一类。 首先观察数据集,利用mass,height&#xff…

人脸识别技术大起底,你了解多少?

来源:与非网这两年,随着科技的迅速发展,人脸识别已经逐渐成为了新时期生物识别技术应用的重要领域,忘记密码了?没事儿,咱还可以“刷脸”!今天,小编将带大家了解一下最新的人脸识别技术,看看这项…

深度学习时出现的一些安装问题+ubuntu apt的一些问题+github release文件加速

一.python用于深度学习时出现的一些安装问题 问题:raise ImportError, str(msg) , please install the python-tk package 解决:apt-get update apt-get install python-tk 问题:pip install pycocotools出现错误 pip instal…

Struts+Tomcat搭建

StrutsTomcat搭建tomcat使用(服务器端开发): 如果要安装Tomcat需要进行的配置:tomcat安装在c: \Tomcat CATALINA_HOME变量值设为: H:\Program Files (x86)\tomcat\apache-tomcat-7.0.27 CATALINA_BASE变量值设为: H:\Program Files (x86)\tomcat\apache-tomcat-…