多进程、多线程、协程、多进程+协程、多线程+协程的并发效率对比

本文对比了多进程、多线程、协程以及它们组合使用的并发效率。在IO密集型任务中,如爬取1000个URL,多进程+协程和多线程+协程的并发效率显著高于单独使用多进程或多线程。其中,多进程+协程表现最佳,总耗时仅为14.04秒,而多线程+协程耗时22.4秒。协程的轻量级特性使其在提高并发效率方面表现出色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、何为进程、线程、协程?

1.进程:运行起来的程序就是进程,是操作系统分配资源的最小单位。
2.线程:线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程。
3.协程:是线程的更小切分,又称为“微线程”,是一种用户态的轻量级线程。
4.三者关系:进程里有线程,线程里有协程

二、进程、线程、协程的区别

1.进程:针对于python语言执行环境来说,多进程是利用多核CPU来完成任务,进程拥有独立的内存空间,所以进程间数据不共享,进程之间的通讯是由操作系统完成的,在切换时,CPU需要进行上下文切换,导致通讯效率比较低、开销比较大。
2.线程:多线程是在一个进程内运行,共享进程的内存空间,通讯效率较高、开销较小。但缺点是:因为python底层的GIL锁(global interpeter lock),python的底层的同步锁太多导致多线程被同步很多次,搞成并发效果不佳。
3.协程:一个可以挂起的函数,协程的调度完全由用户控制,用函数切换,开销极小。

三、多进程、多线程、协程的使用场景

1.多进程:CPU密集运算,大部分时间花在计算
2.多线程、协程:IO密集型(网络IO、磁盘IO、数据库IO),大部分时间花在传输

四、如何提高多进程、多线程、协程的并发效率?

1.使用多进程+协程
2.使用多线程+协程

五、不同并发形式的简单例子

并发任务:爬取1000个url,获取响应码,并进行打印。

1.仅使用多进程:
  • (1)从文件中读取1000个url,并将这1000个url放入队列中
  • (2)任务函数,当队列不为空时,从队列中获取url,并通过requests的get方法,获取status_code,并打印
  • (3)启动多进程(进程数等于CPU数),执行任务函数
  • (4)计算总耗时
#--coding:utf-8--
from multiprocessing import Process,Queue
import requests
import time

def crawl_process(queue,i):
    while not queue.empty():
        try:
            url = queue.get()
            r = requests.get(url,timeout = 3)
            print("我是第%s个【进程】" %i,url,r.status_code)
        except Exception as e:
            print(e)
    return


if __name__ == '__main__':
    queue = Queue()
    urls = []
    with open("d:\\urls.txt") as fp:
        for url in fp:
            urls.append(url.strip())
    print("一共%s个url" %len(urls))
    for url in urls:
        queue.put(url)

    start = time.time()
    print("********************** 开始计时 **********************")
    p_list = []
    for i in range(1,5):
        p = Process(target=crawl_process, args=(queue,i)) #多进程
        p_list.append(p)
        p.start()
        print(p)
    for p in p_list:
        p.join()
        print(p)
    end = time.time()
    print("********************** 结束计时 **********************")
    print("总耗时:",end - start)
运行结果(仅多进程):

我是第3个【进程】 http://pinyin.sogou.com/ 200
我是第1个【进程】 https://ie.sogou.com 200
<Process(Process-1, stopped)>
我是第2个【进程】 https://www.sohu.com/upload/uiue20200707/vz_sohu.pdf 200
<Process(Process-2, stopped)>
<Process(Process-3, stopped)>
我是第4个【进程】 http://investors.sohu.com/ 200
<Process(Process-4, stopped)>
********************** 结束计时 **********************
总耗时: 72.10254549980164

2.仅使用多线程:
    评论 3
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值