对于多线程的使用,我们经常是用thread来创建,比较繁琐. 在Python中,可以使用map函数简化代码。map可以实现多任务的并发

简单说明map()实现多线程原理:

task = [‘任务1', ‘任务2', ‘任务3', …]

map 函数一手包办了序列操作、参数传递和结果保存等一系列的操作,map函数负责将线程分给不同的CPU。

在 Python 中有个两个库包含了 map 函数: multiprocessing 和它鲜为人知的子库 multiprocessing.dummy.dummy 是 multiprocessing 模块的完整克隆,唯一的不同在于 multiprocessing 作用于进程,而 dummy 模块作用于线程。

代码如下:

from multiprocessing.dummy import Pool as ThreadPool
import os
import requests
import time
import numpy as np
# 文件夹位置
filepath = r'C:\Users\Administrator\Desktop\ceshi'
pool = ThreadPool(10)#开启线程数,即一次性抛出的请求数
time_list = []#用来计算时间
xml_list = []#数据集
pathDir = os.listdir(filepath)
for i, allDir in enumerate(pathDir):
 filename = os.path.join('%s%s' % (filepath + '\\', allDir))
 kk = open(filename, 'r', encoding='utf-8').read()
 data = kk.encode('utf-8')
 for k in range(10):
  xml_list.append(data)
def res(data):
 # 访问目标服务器地址
 url_host = 'https://mp.csdn.net/mdeditor#'
 start = time.clock()
 s = requests.post(url_host, data=data)
 end = time.clock()
 if s.status_code == 200:
  print(end-start)
  time_list.append(end-start)
 else:
  print('请求失败')
# 传入的参数,1为函数, 2为参数
result = pool.map(res, xml_list)
all_arr = np.array(time_list)
aver = np.mean(all_arr)
variance = np.var(all_arr)
mid = np.median(all_arr)
min_num = np.min(all_arr)
max_num = np.max(all_arr)
print('平均值 : '+ str(aver))
print('方差 : ' + str(variance))
print('中值 : ' + str(mid))
print('最小值 : ' + str(min_num))
print('最大值 : ' + str(max_num))

个人做的小测试,如果有错误的地方希望留言提出意见及建议。

补充:python多进程(multiprocessing)(map)

map的基本使用:

map函数一手包办了序列操作,参数传递和结果保存等一系列的操作。

from multiprocessing.dummy import Pool
poop = Pool(4)  # 4代表电脑是多少核的
results = pool.map(爬取函数,网址列表)

from multiprocessing.dummy import Pool as ThreadPool
import requests
import time
kv = {'user-agent':'Mozilla/5.0'}
def getsource(url):
 html = requests.get(url,headers=kv)
urls = []
for i in range(0,41):
 i = i*50
 newpage = 'https://tieba.baidu.com/f?kw=读书&ie=utf-8&pn=' + str(i)
 urls.append(newpage)
# 单线程爬取
time1 = time.time()
for each in urls:
 print(each)
 getsource(each)
time2 = time.time()
print('单线程耗时: ' + str(time2-time1))
# 多线程爬取
pool = ThreadPool(8)
time3 = time.time()
results = pool.map(getsource, urls)
pool.close()
pool.join()
time4 = time.time()
print('多线程所消耗时间:' + str(time4 - time3))

以上为个人经验,希望能给大家一个参考,也希望大家多多支持程序员的世界。如有错误或未考虑完全的地方,望不吝赐教。

python 如何用map()函数创建多线程任务的更多相关文章

  1. 十分钟轻松掌握dataframe数据选择

    数据初始化import pandas as pdimport numpy as npa=np.array([['北京','北方','一线','非沿海'],['杭州','南方','二线','非沿海'],['深圳','南方','一线','沿海'],['烟台','北方','三线','沿海']])df=pd......

  2. Python随机函数random随机获取数字、字符串、列表等使用详解

    在python中用于生成随机数的模块是random,在使用前需要import, 下面看下它的用法。Python随机生成一个浮点数 random.randomrandom.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0注意: 以下代码在Python3.5下测试通......

  3. pycharm 如何跳出服务器证书不受信任的提示

    出现这个问题解决方法:点击File > Settings > Tools > Server Certificates > Accept non-trusted certificates automatically勾上就好啦~补充:pycharm启动出现Server's cer......

  4. Python利用socket模块开发简单的端口扫描工具的实现

    一、socket1.简介Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。socket的工作流程socket 采用C/S 模式,分为服务端和客户端服务端数据处理流程创建socket ......

  5. pytorch 实现冻结部分参数训练另一部分

    1)添加下面一句话到模型中for p in self.parameters():p.requires_grad = False比如加载了resnet预训练模型之后,在resenet的基础上连接了新的模快,resenet模块那部分可以先暂时冻结不更新,只更新其他部分的参数,那么可以在下面加入上面那句话......

  6. python 装饰器的基本使用

    知识点简单的装饰器带有参数的装饰器带有自定义参数的装饰器类装饰器装饰器嵌套@functools.wrap装饰器使用基础使用简单的装饰器def my_decorator(func):def wrapper():print('wrapper of decorator')func()return wrap......

  7. Python学习(9)(元组、定义、常用操作、循环遍历、应用场景、元组与列表的转换)

    Python学习(9)一、python的元组 定义二、python的元组 常用操作三、python 元组的循环遍历四、python 元组的应用场景五、python 元组和列表之间的转换一、python的元组 定义Tuple (元组)与列表类似,不同之处在于元组的 元素不能修改 元组表示多个元素组成的......

  8. Python获取Linux系统内存情况

    [Python]代码import subprocessimport rekeydic = {"MemTotal":"总内存(单位G)","MemFree":"剩余内存(单位G)","MemAvailable&q......

  9. python中re模块知识点总结

    一、什么是正则表达式?正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。二、正则表达式的匹配规则1.表......

  10. Python opencv操作深入详解

    直接读取图片def display_img(file="p.jpeg"):img = cv.imread(file)print (img.shape)cv.imshow('image',img)cv.waitKey(0)cv.destroyAllWindows()读取灰度图片de......

随机推荐

  1. python3两数相加

    两数相加给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6......

  2. ASP.NET Core 3.1 中间件

    参考微软官方文档 :https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-3.1一、ASP.NET Core 中间件简介1.1 定义:中间件是一种装配到应用管道以处理请求和响应的软件......

  3. Nginx中break与last的区别详析

    先说区别last,重写后的规则,会继续用重写后的值去匹配下面的location。break,重写后的规则,不会去匹配下面的location。使用新的规则,直接发起一次http请求了。Nginx 配置文件server {listen 88;server_name _;location /break {......

  4. ASP.NET Core错误处理中间件[2]: 开发者异常页面

    异常页面的DeveloperExceptionPageMiddleware中间件,该中间件在捕捉到后续处理过程中抛出的异常之后会返回一个媒体类型为text/html的响应,后者在浏览器上会呈现一个错误页面。由于这是一个为开发者提供诊断信息的异常页面,所以可以将其称为开发者异常页面(Developer......

  5. JS实现公告上线滚动效果

    本文实例为大家分享了JS实现公告上线滚动效果的具体代码,供大家参考,具体内容如下实现的效果如下,新闻公告上下滚动。代码:Document* {padding: 0;margin: 0;box-sizing: border-box;}.notice-news {width: 400px;height:......

  6. opencv python 对指针仪表读数识别的两种方式

    我尝试了两种方式用opencv 对指针仪表进行读数识别,1. 先模板匹配,然后边缘检测 + 霍夫直线2. 按轮廓大小过滤,然后边缘检测 + 霍夫直线两种方式对光线都非常敏感其中第一种的应用范围更广,背景复杂一点也能识别到个人比较喜欢这种方式第二种的限制多一点,对背景、光线条件要求比较高对于固定位置,......

  7. 一文秒懂nodejs中的异步编程

    文章目录 简介同步异步和阻塞非阻塞javascript中的回调回调函数的错误处理回调地狱 ES6中的Promise什么是PromisePromise的特点Promise的优点Promise的缺点Promise的用法Promise的执行顺序 async和awaitasync的执行顺序async的特点 ......

  8. android加密参数定位实现方法

    在逆向一个Android程序时,如果只是盲目的分析需要阅读N多代码才能找到程序的关键点或Hook点,本文将分享一下如何快速的找到APP程序的加密参数位置,其实不论是找关键位置、找hook点,找加密参数、代码逻辑追踪,都是类似的处理方法。巧用搜索-静态分析一般静态分析找加密参数的流程都是先查壳(脱壳)......

  9. OpenCV如何去除图片中的阴影的实现

    一、前言如果你自己打印过东西,应该有过这种经历。如果用自己拍的图片,在手机上看感觉还是清晰可见,但是一打印出来就是漆黑一片。比如下面这两张图片:因为左边的图片有大片阴影,所有打印出来的图片不堪入目(因为打印要3毛钱,所以第二张图片只是我用程序模拟的效果)。那有什么办法可以解决吗?答案是肯定的,今天我......

  10. python如何实现单向链表及单向链表的反转

    链表的定义链表中的每个节点会存储相邻节点的位置信息,单链表中的每个节点只存储下一关节点的位置信息单向链表的实现class ListNode:def __init__(self, val):self.val = valself.next = None要实现单向链表只需要把几个节点关联起来就可以了,把一......