栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python多线程编程(多进程编程和多线程编程)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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代码仓库

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/772393.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号