• 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))
  • 相关阅读:
    Spring Boot 3.日志
    Inspection info: Checks Spring Boot Application Setup. @SpringBootApplication used in default package Redundant @ComponentScan declaration Redundant @EnableAutoConfiguration declaration New in 2018.2
    mac下编译安装pcntl扩展
    php的if判断出现的问题思考
    php判断类的方法是否存在
    mac下phpstorm快捷键
    php关于always_populate_raw_post_data报错的解决方案
    如何使用mac快捷键打开终端
    linux文件权限管理(超详细)
    linux常用命令合集
  • 原文地址:https://www.cnblogs.com/liuduo/p/7657587.html
Copyright © 2020-2023  润新知