问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Python多线程和多进程谁更快

发布网友 发布时间:2022-04-18 07:42

我来回答

2个回答

懂视网 时间:2022-04-18 12:03

下面小编就为大家带来一篇python多进程和多线程究竟谁更快(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

python3.6

threading和multiprocessing

四核+三星250G-850-SSD

自从用多进程和多线程进行编程,一致没搞懂到底谁更快。网上很多都说python多进程更快,因为GIL(全局解释器锁)。但是我在写代码的时候,测试时间却是多线程更快,所以这到底是怎么回事?最近再做分词工作,原来的代码速度太慢,想提速,所以来探求一下有效方法(文末有代码和效果图)

这里先来一张程序的结果图,说明线程和进程谁更快

一些定义

并行是指两个或者多个事件在同一时刻发生。并发是指两个或多个事件在同一时间间隔内发生

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个程序的执行实例就是一个进程。

实现过程

而python里面的多线程显然得拿到GIL,执行code,最后释放GIL。所以由于GIL,多线程的时候拿不到,实际上,它是并发实现,即多个事件,在同一时间间隔内发生。

但进程有独立GIL,所以可以并行实现。因此,针对多核CPU,理论上采用多进程更能有效利用资源。

现实问题

在网上的教程里面,经常能见到python多线程的身影。比如网络爬虫的教程、端口扫描的教程。

这里拿端口扫描来说,大家可以用多进程实现下面的脚本,会发现python多进程更快。那么不就是和我们分析相悖了吗?

import sys,threading
from socket import *

host = "127.0.0.1" if len(sys.argv)==1 else sys.argv[1]
portList = [i for i in range(1,1000)]
scanList = []
lock = threading.Lock()
print('Please waiting... From ',host)


def scanPort(port):
 try:
 tcp = socket(AF_INET,SOCK_STREAM)
 tcp.connect((host,port))
 except:
 pass
 else:
 if lock.acquire():
 print('[+]port',port,'open')
 lock.release()
 finally:
 tcp.close()

for p in portList:
 t = threading.Thread(target=scanPort,args=(p,))
 scanList.append(t)
for i in range(len(portList)):
 scanList[i].start()
for i in range(len(portList)):
 scanList[i].join()

谁更快

因为python锁的问题,线程进行锁竞争、切换线程,会消耗资源。所以,大胆猜测一下:

在CPU密集型任务下,多进程更快,或者说效果更好;而IO密集型,多线程能有效提高效率。

大家看一下下面的代码:

import time
import threading
import multiprocessing

max_process = 4
max_thread = max_process

def fun(n,n2):
 #cpu密集型
 for i in range(0,n):
 for j in range(0,(int)(n*n*n*n2)):
 t = i*j

def thread_main(n2):
 thread_list = []
 for i in range(0,max_thread):
 t = threading.Thread(target=fun,args=(50,n2))
 thread_list.append(t)

 start = time.time()
 print(' [+] much thread start')
 for i in thread_list:
 i.start()
 for i in thread_list:
 i.join()
 print(' [-] much thread use ',time.time()-start,'s')

def process_main(n2):
 p = multiprocessing.Pool(max_process)
 for i in range(0,max_process):
 p.apply_async(func = fun,args=(50,n2))
 start = time.time()
 print(' [+] much process start')
 p.close()#关闭进程池
 p.join()#等待所有子进程完毕
 print(' [-] much process use ',time.time()-start,'s')

if name=='main':
 print("[++]When n=50,n2=0.1:")
 thread_main(0.1)
 process_main(0.1)
 print("[++]When n=50,n2=1:")
 thread_main(1)
 process_main(1)
 print("[++]When n=50,n2=10:")
 thread_main(10)
 process_main(10)

结果如下:

可以看出来,当对cpu使用率越来越高的时候(代码循环越多的时候),差距越来越大。验证我们猜想

CPU和IO密集型

1、CPU密集型代码(各种循环处理、计数等等)

2、IO密集型代码(文件处理、网络爬虫等)

判断方法:

1、直接看CPU占用率, 硬盘IO读写速度

2、计算较多->CPU;时间等待较多(如网络爬虫)->IO

3、请自行百度

【相关推荐】

1. Python中多进程与多线程实例(一)

2. Python中推荐使用多进程而不是多线程?分享推荐使用多进程的原因

3. Python中多进程与多线程实例(二)编程方法

4. 关于Python进程、线程、协程详细介绍

5. Python 并发编程之线程池/进程池

热心网友 时间:2022-04-18 09:11

肯定线程快啊,进程要操作系统响应...
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 铁锅用了后变颜色了,开锅后炒了个菜后就这样?不敢烧了,安全吗?为什么会这样?会消失吗?还是苏泊尔的 python多进程和多线程究竟谁更快 上征信的网贷可以借吗 上征信了还能网贷吗 办公家具茶台茶桌什么样的最好 客厅是一定要放茶几的吗?空间比较小,不放茶几行不行? 客厅用大茶桌茶椅取代沙发茶几可以吗? 跪求50篇论文的作者,发表时间,期刊名字 中国在国际上是否已经摆脱贫穷的形象? 渝快保未付款的订单多长时间可以取消 我的车cs55昨天突然开空调成了热风,咋弄都是热风,怎么弄 长安cs55空调温度高配才显示数字吗? 长安cs55没暖风是哪几个原因? 长安cs55空调怎么清洗?? 长安cs55不能制热吹出来的是冷风 cS55手动档汽车空调一吸合一断开 想要在北海银滩做冰镇饮品生意需要办理什么手续,大概要多少钱? 大学生应该如何看待中国制造2025的论文 面对"中国制造2025",谈一谈作为个人有哪些作为的2000字论文 跟女生聊天,我说hi,她说怎么了,我说没事,你跑进我的心里了,怎么回复啊?是不是太LOW了? 《超级神途》txt下载在线阅读全文,求百度网盘云资源 超级神途小说怎么不更新了 《破天神途》最新章节全文阅读免费下载百度网盘资源,谁有? 《武炼神途》最新章节全文阅读免费下载百度网盘资源,谁有? 同学,来个浅笑清鸣gl全文,可好 神途超级牛在哪 神途超级护身符怎么用 全然的近义词是什么 用三个没有造句 大模大样的意思 求QQ搞笑小黄脸表情包+囧脸小人表情包,要全一些的!谢谢! 玛雅人都有哪些预言?它们都实现了吗? 求全套玄鸡QQ搞笑表情包 感谢感谢 要全 玛雅人的四大预言 玛雅人留下了哪些预言,有哪些成功了有哪些失败了? 玛雅人当年留下的神秘预言,现在有多少已经应验了? 同一台电脑,一个QQ可以保存收藏表情,另一个QQ保存后,重新登录就没了。这是什么情况? 丁程鑫收到快本赠送的高考加油大礼包,当时的丁程鑫是何表情? 玛雅人最后的预言是什么?为何有人说“已实现”了? 5000年前玛雅人预知的4大预言,现已全部实现,如今他们怎样了?