进程池

进程池

1.共享内存

from multiprocessing import Manager,Process,Lock
def work(d,lock):
    with lock:
        d['count']-=1
        # temp=d['count']
        # d['count']=temp-1

if __name__=='__main__':
    m=Manager()
    d=m.dict({"count":100})
    lock=Lock()
    p_l=[]
    for i in range(100):
        p=Process(target=work,args=(d,lock))
        p_l.append(p)
        p.start()

    for p in p_l:
        p.join()
    print(d)
共享内存

2.进程池

(1)同步调用与阻塞:这是两个概念

同步调用:提交完任务后,在原地等待任务结束,其它任务也进不来,一旦结束可以立刻拿到结果

阻塞:正在运行的进程遇到io则进入阻塞状态

(2)异步调用和非阻塞:两个不同的概念

异步调用:提交完任务后,不会在原地等待任务结束,会继续提交下一次任务,等到所有任务结束后,才会get 到结果

非阻塞:可能是运行状态,可能是就绪状态

(3)只有在进程数目不是很多的情况可以用

(4)一般操作系统有几个核就开几个进程

from multiprocessing import Pool
import os,time,random
def work(n):
    print('%s is working'%os.getpid())
    time.sleep(random.randint(1,3))  #阻塞
    return n**2
if __name__=='__main__':
    p=Pool(4)
    objs=[]
    for i in range(10):
        # res=p.apply(work,args=(i,))  #同步调用和阻塞是两个概念,同步调用:提交完任务后,在原地等待任务结束,其它任务也进不来,一旦结束可以立刻拿到结果
        # print(res)


        obj=p.apply_async(work,args=(i,))  #异步调用
        objs.append(obj)
    p.close()
    p.join()
        # print(obj)
    for obj in objs:
        print(obj.get())
进程池

3.回调函数

主进程负责干回调函数的活

import requests
import os,time
from multiprocessing import Pool
# 'http://www.baidu.com'
def get(url):
    print('%s GET %s'%(os.getpid(),url))
    response = requests.get(url)
    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)
    objs=[]
    for url in urls:
        obj=p.apply_async(get,args=(url,),callback=parse)
        objs.append(obj)
    p.close()
    p.join()
# 解析的时间比下载执行的速度快,在下载的过程中,一个下载好后直接解析
回调函数

4.集中式与分布式

(1)集中式开发:是将所有数据存放在中央服务器上,基于网络连接服务器,工作时从服务端取出数据,工作完之后将数据提交到服务端保存。

优点:减少了硬件与软件成本

缺点:①如果网络出现异常或者网速不好,直接影响工作效率;

   ②如果服务器崩溃了,基本上就不能工作了;

   ③安全度不高,数据放在一个中央服务器中,被黑客攻击时,容易丢失重要数据

(2)分布式开发:有一个作为交换信息的基本服务器,没有它也可以工作,只是比较麻烦,而每一台电脑有自己独立的开发环境,不需要联网,本地直接运行,相对集中式安全系数高很多。

posted @ 2017-10-22 18:32  星雨5213  阅读(107)  评论(0)    收藏  举报