• 欢迎访问挑战自我博客网站,安全研究,web渗透,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入挑战自我博客网站 网站主页

python的多进程模式

python 挑战自我 1064次浏览 已收录 0个评论

1、文章简介

相信大家在了解了Python的多线程模式之后,也清楚了在python中有GIL这么个东西,所以cpu密集型的程序在python中是无法实现真正并发的,因为实际执行的还的单个线程,可现在的服务器都至少是16核,那岂不浪费了??

所以如果我们想要重分利用cpu资源,我们就需要在Python中采用多进程模式,就是用进程的方式实现并发,在Python下实现多进行时用multiprocessing模块来实现,这个模块用法跟threading.Thread非常类似,但不同的时它没有GIL锁,可以在多核CPU机器上来实现真正的并发执行。

2、简单的多进程程序代码

关于进程线程概念就不多说了,具体情况直接上代码:

#!/usr/bin/evn python

import requests
import time
from multiprocessing import Process

def get_site_code(url):
    r = requests.get(url)
    status = r.status_code
    line = url +  ' ' + str(status)
    with open('/tmp/site_stauts.txt', 'a+') as f:
        f.writelines(line + '\n')

if __name__ == '__main__':
    print 'starting at:', time.ctime()
    jobs = []
    for url in open('urls.txt'):
        url = url.strip()
        p = Process(target=get_site_code, args=(url,))
        jobs.append(p)

    for p in jobs:
        p.start()

    for p in jobs:
        p.join()

    print 'Done at:', time.ctime()

3、多进程中的进程池代码

从上面代码可以看到,在使用上真的非常像线程,而且大部分方法的功能也是一样的,这里是用Process创建进程对象,join()方法等待进程池中的全部进程,target我们给一个可调用对象,这是我认为最简答的方式,给了一个函数,一样运行没有任何问题。

上面这种方法我们已经实现了多进程,如果任务执行的对象不算太多是可以的,但如果任务时间比较长且操作对象比较多,那么可能会出现进程占用系统资源过度造成服务器慢的情况。因为同时在机器上启动上百上千个进程,而且短时间任务执行不完,就会非常的耗系统资源,机器估计卡的用不了,怎么解决这种问题呢??

这就需要用到我们的进程池了,使用Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求,但如果池中的进程数已经达到规定最大值,那么该请求就会等待,进程池的大小可以参考机器CPU核数来指定,那么这样一来,我们的代码需要修改如下:

#!/usr/bin/evn python

import requests
import time
from multiprocessing.pool import Pool

def get_site_code(url):
    r = requests.get(url)
    status = r.status_code
    line = url +  ' ' + str(status)
    with open('/tmp/site_stauts.txt', 'a+') as f:
        f.writelines(line + '\n')

if __name__ == '__main__':
    url_list = []
    print 'starting at:', time.ctime()
    for url in open('urls.txt'):
        url = url.strip()
        url_list.append(url)

    pool = Pool(5)
    pool.map(get_site_code,url_list)
    print 'Done at:', time.ctime()

可以看到我们使用了进行池,代码逻辑反而简单了,这里map函数跟python中内置的map功能一样,它需要2个参数,一个是函数,一个是序列,不同的是它可以支持多进程,这里我设定了5个进程,就是最多可以跑5个进程,这样一来就解决了我们上面提到的问题。


挑战自我博客, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明python的多进程模式
喜欢 (9)
支付宝[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址