python多进程并发接口_python多进程并发之multiprocessing

Python并发之多进程 -- multiprocessing

multiprocessing包是Python中的多进程管理包。

它与 threading.Thread类似,可以利用multiprocessing.Process对象来创建一个进程。该进程可以允许放在Python程序内部编写的函数中。该Process对象与Thread对象的用法相同.

方法有:

is_alive()

join([timeout])

run()

start()

terminate()

属性有:

authkey

daemon(要通过start()设置)

exitcode(进程在运行时为None、如果为–N,表示被信号N结束)

name

pid

此外multiprocessing包中也有Lock/Event/Semaphore/Condition类,用来同步进程,其用法也与threading包中的同名类一样。multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。

这个模块表示像线程一样管理进程,这个是multiprocessing的核心,它与threading很相似,对多核CPU的利用率会比threading好的多。

看一下Process类的构造方法:

__init__(self, group=None, target=None, name=None, args=(), kwargs={})

参数说明:

group:进程所属组。基本不用

target:表示调用对象。

args:表示调用对象的位置参数元组。

name:别名

kwargs:表示调用对象的字典。

创建进程的简单实例:

import requests

from multiprocessing import Process

urls = [

"http://www.python.org",

"http://www.python.org/about/",

"http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html",

"http://www.python.org/doc/",

"http://www.python.org/download/",

"http://www.python.org/getit/",

"http://www.python.org/community/",

"https://wiki.python.org/moin/",

]

def get_status_code(url):

resp = requests.get(url)

print("url:{}\ncode:{}\n{}".format(url, resp.status_code, "-" * 100))

if __name__ == "__main__":

for url in urls:

p = Process(target=get_status_code, args=(url,))

p.start()

p.join()

执行结果:

url:http://www.python.org

code:200

------------------------------------------------------------------------------

url:http://www.python.org/about/

code:200

------------------------------------------------------------------------------

url:http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html

code:200

------------------------------------------------------------------------------

url:http://www.python.org/doc/

code:200

------------------------------------------------------------------------------

url:http://www.python.org/download/

code:200

------------------------------------------------------------------------------

url:http://www.python.org/getit/

code:200

------------------------------------------------------------------------------

url:http://www.python.org/community/

code:200

------------------------------------------------------------------------------

url:https://wiki.python.org/moin/

code:200

创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,并用其start()方法启动,join()方法表示等待子进程结束以后再继续往下运行,通常用于进程间的同步。

注意:

在Windows上要想使用进程模块,就必须把有关进程的代码写在当前.py文件的if name == ‘main’ :语句的下面,才能正常使用Windows下的进程模块。Unix/Linux下则不需要。

multiprocess.Pool

当被操作对象数目不大时,可以直接利用multiprocessing中的Process动态成生多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。

Pool可以提供指定数量的进程供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。

apply_async和apply

函数原型:

apply_async(func[, args=()[, kwds={}[, callback=None]]])

二者都是向进程池中添加新的进程,不同的时,apply每次添加新的进程时,主进程和新的进程会并行执行,但是主进程会阻塞,直到新进程的函数执行结束。 这是很低效的,所以python3.x之后不再使用

apply_async和apply功能相同,但是主进程不会阻塞。

import requests

from multiprocessing import Pool

urls = [

"http://www.python.org",

"http://www.python.org/about/",

"http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html",

"http://www.python.org/doc/",

"http://www.python.org/download/",

"http://www.python.org/getit/",

"http://www.python.org/community/",

"https://wiki.python.org/moin/",

]

def get_status_code(url):

resp = requests.get(url)

print("url:{}\ncode:{}\n{}".format(url, resp.status_code, "-" * 100))

if __name__ == "__main__":

# 维持执行的进程总数为processes,当一个进程执行完毕后会添加新的进程进去

p = Pool()

for url in urls:

# 异步开启进程, 非阻塞型, 能够向池中添加进程而不等待其执行完毕就能再次执行循环

p.apply_async(func=get_status_code, args=(url,))

print("Waiting for all subprocesses done...")

p.close() # 关闭pool, 则不会有新的进程添加进去

p.join() # 必须在join之前close, 然后join等待pool中所有的线程执行完毕

print('All subprocesses done.')

运行结果:

Waiting for all subprocesses done...

url:http://www.onlamp.com/pub/a/python/2003/04/17/metaclasses.html

code:200

------------------------------------------------------------------------------

url:http://www.python.org/doc/

code:200

----------------------------------------------------------------------------------------------------

url:http://www.python.org/about/

code:200

------------------------------------------------------------------------------

url:http://www.python.org

code:200

------------------------------------------------------------------------------

url:https://wiki.python.org/moin/

code:200

------------------------------------------------------------------------------

url:http://www.python.org/download/

code:200

------------------------------------------------------------------------------

url:http://www.python.org/community/

code:200

------------------------------------------------------------------------------

url:http://www.python.org/getit/

code:200

------------------------------------------------------------------------------

All subprocesses done.

其他资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值