Python Day35进程池,回调函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python Day35进程池,回调函数相关的知识,希望对你有一定的参考价值。

一、进程池:

  

什么是进程池:创建一定数量的进程个数

 同步和异步:提交任务的两种方式。

 Pool:创建进程池和控制进程的数目,默认的个数是根据CPU的核数

 apply:传入两个参数,第一个是指定任务。向进程池提交一个任务,实现了串行和同步调用。结束任务后,立马会拿到结果。

  开启的进程数目有几个,就会有几个pid。

 什么是同步调用:提交一个任务,等到任务结束后才能执行下一个任务。

import multiprocessing
import time
import random
import os
def walk(n):
    print(%s is walking%os.getpid())
    time.sleep(random.random())
    return n

if __name__==__main__:
    p=multiprocessing.Pool(4)
    for i in range(10):
        q=p.apply(walk,args=(i,))
        print(q)

apply_async:向进程池提交任务,提交完任务后就不管了,只管提交任务,不能直接执行任务。实现了一个并发和恶异步调用

  执行方法:先close:关闭任务,好让任务结束

       然后join:等待一个进程池不在提交任务,并且任务结束和计算任务个数

       最后get:获取返回值

 什么是异步调用:提交完一个任务过后不会在原地等待,而是继续提交下一个任务。等待所有的任务结束后在用get获取任务

 

import multiprocessing
import time
import random
import os
def walk(n):
    print(%s is walking%os.getpid())
    time.sleep(random.random())
    return n

if __name__==__main__:
    p=multiprocessing.Pool(4)
    li=[]
    for i in range(10):
        q=p.apply_async(walk,args=(i,))
        li.append(q)
    p.close()
    p.join()
    for i in li:
        print(i.get())

二、回调函数:

什么是回调函数:通过一个函数内存调用的函数,如果将这个函数的地址当作参数传给另一个函数,当这个函数的地址用来调用其所只想的函数是,这个所指向的函数就是回调函数。

  callback:后面加上的是回调函数

  回调函数的进程其实就是主进程。

 用回调函数实现一个网络爬虫;需要用到requests模块

  get:获取网址

  status_code:返回状态码

  text:查看下载网址的内容

详情访问:http://www.cnblogs.com/hainan-zhang/p/6222552.html

 

from multiprocessing import Pool,Process
import requests
import os
import time,random
def get(url):
    print(%s GET %s %(os.getpid(),url))
    response=requests.get(url)
    time.sleep(random.randint(1,3))
    if response.status_code == 200:
        print(%s DONE %s % (os.getpid(), url))
        return {url:url,text:response.text}
 
def parse(dic):
    print(%s PARSE %s %(os.getpid(),dic[url]))
    time.sleep(1)
    res=%s:%s\\n %(dic[url],len(dic[text]))
    with open(db.txt,a) as f:
        f.write(res)
 
if __name__ == __main__:
    urls=[
        https://www.baidu.com,
        https://www.python.org,
        https://www.openstack.org,
        https://help.github.com/,
        http://www.sina.com.cn/
    ]
    p=Pool(2)
    start_time=time.time()
    objs=[]
    for url in urls:
        obj=p.apply_async(get,args=(url,),callback=parse) #主进程负责干回调函数的活
        objs.append(obj)
    p.close()
    p.join()
 
    print(,(time.time()-start_time))

 

以上是关于Python Day35进程池,回调函数的主要内容,如果未能解决你的问题,请参考以下文章

Python 3 进程池与回调函数

python进程池中的回调函数

Python学习第21篇:进程池以及回调函数

Python网编_进程池的回调函数

python3 进程池回调函数

python全栈开发基础第二十二篇进程池和回调函数