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
' %(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))
原文地址:https://www.cnblogs.com/liuduo/p/7657587.html