如何简单区分Python多进程与多线程

前言

之前在做项目时遇到并发的问题,就想到了Python多线程与多进程,由于Arcpy的特殊性,好多rest框架不合适,有同学如果用到arcpy,同时用到python rest框架,还是不要用flask,前辈踩过的坑哈哈。扯远了,下面就说说多线程与多进程的区别。

区别

上面这张片子进行了一个简单概念性的描述,但是最让人眨眼的是右边的图哈哈,这是我当时为了描述的客观可懂专门找的图。

多进程就相当于大伙干活,然后一起吃饭,各自吃各自的餐,最后把活干完,菜香只能自己体会,各自沉浸在各自的快乐中,吃饱喝足,说不上饭有剩的。

多线程相当于大伙给老板打工,完了一起聚餐,一个小锅,大伙一起抢着吃,锅大了都吃的好,但是锅小了都吃不饱,你抢我的我抢你,他一筷子下去手太大你还要等着。

示例代码

多线程

from multiprocessing.dummy import Pool as ThreadPool
import multiprocessing, time


def mainfunc(num):
    starttime = time.time()
    s = 1
    for i in range(1, num):
        s *= i

    endtime = time.time()
    return "耗时:{0}".format(endtime-starttime)


if __name__ == '__main__':
    pool = ThreadPool(multiprocessing.cpu_count())
    listdata = [200000, 200000, 200000, 200000, 200000, 200000, 200000, 200000]
    result = pool.map(mainfunc, listdata)
    pool.close()
    pool.join()
    print(result)

多进程

import multiprocessing, time


def mainfunc(num):
    starttime = time.time()
    s = 1
    for i in range(1, num):
        s *= i

    endtime = time.time()
    return "耗时:{0}".format(endtime-starttime)


if __name__ == '__main__':
    pool = multiprocessing.Pool(multiprocessing.cpu_count())
    listdata = [200000, 200000, 200000, 200000, 200000, 200000, 200000, 200000]
    result = pool.map(mainfunc, listdata)
    pool.close()
    pool.join()
    print(result)

阻塞与非阻塞(异步)

上面贴了详细的代码,而对于multiprocessing库来说,Pool类有下面几种方法,也就是阻塞和非阻塞。

1. map&map_async

map是阻塞的,它会阻塞进程直至结果返回,相反map_async则是异步的每个进程都是单独的,不会相互影响。

2. apply&apply_async

和map一样,apply是阻塞的,但是两个函数对应的参数是不一样的,详细可以去接口看看。

运行结果

1. 多进程

['耗时:16.133437156677246', '耗时:16.113436937332153', '耗时:16.093438148498535', '耗时:16.0244357585907', '耗时:16.160436868667603', '耗时:16.20243549346924', '耗时:16.192437171936035', '耗时:15.965435981750488']

 2. 多线程

['耗时:75.55738019943237', '耗时:80.21012735366821', '耗时:78.34934687614441', '耗时:69.6355893611908', '耗时:65.87498378753662', '耗时:74.0091381072998', '耗时:78.06873106956482', '耗时:79.26412773132324']

 可以看到多进程运行时会启动多个python,前面我的设置是根据本机的cpu数量去设置的。而多线程只有一个python进程,对比最后的耗时,显然多进程会快好多,进程直接不相互抢占资源,而多线程就不一样的,相互直接因为资源会大打出手。

到此结束,有不当的还希望大家批评指正!

源码仓库:Python代码集: python代码仓库

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AnywalkerGISer

加个鸡腿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值