一、进程补充:

1,生产者消费者模型:

  两类角色,一类负责生产数据,另外那类负责数据

  生产完放到共享空间,另外那类到空间取数据进行处理

  好处: 生产数据的同时可以进行数据的处理,不用等(并发效果)

  问题:要有共享空间(1.文件--硬盘,速度慢;2.内存)

     要有锁

  队列可以完美解决既是内存空间又自带加锁功能

2,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的

二、共享数据(了解,主要使用队列)

 from multiprocessing import Process,Manager,Lock
def work(dic,mutex):
with mutex:
dic['count']-=1 if __name__ == '__main__':
mutex=Lock()
m=Manager()
share_dic=m.dict({'count':100})
l_p=[]
for i in range(100):
p=Process(target=work,args=(share_dic,mutex))
l_p.append(p)
p.start()
for i in l_p:
i.join()
print(share_dic)

三、进程池(重要知识点)

1.进程池:放进程的池子 -- 控制进程的数量

2. n个cpu 开n个进程 效率最高

3.进程池可以指定大小,如不指定   默认是cpu的个数

4.应用

apply,忘记apply

弊端:apply效率低,串行--主程序要等一个程序运行完才能运行下一个

 from multiprocessing import Pool
import time,os,random
def task(n):
print('%s is running'%os.getpid())
time.sleep(random.randint(1,3))
print('%s is done'%os.getpid())
return n**2 if __name__ == '__main__':
p=Pool(4)
obj_l=[]
for i in range(1,7):
obj=p.apply_async(task,args=(i,)) #async提交的是任务 ,不是进程
obj_l.append(obj)
p.close()
p.join()
print('zhu')
for obj in obj_l:
print(obj.get()) #等进程都运行完,一起取结果 -- 并发
#如果运行完一个进程就取一个结果的话 和apply的效果是一个性质-- 串行

apply_async

#  p.close()      # 禁止往进程池内再添加任务

5. apply_async 的应用:

 from multiprocessing import Pool
from socket import *
s=socket(AF_INET,SOCK_STREAM)
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.bind(('127.0.0.1',8088))
s.listen(5)
def talk(conn):
while True:
try:
cmd=conn.recv(1024)
if not cmd:break
conn.send(cmd.upper())
except Exception:
break
conn.close() if __name__ == '__main__':
p=Pool(4)
while True:
conn,addr=s.accept()
p.apply_async(talk,args=(conn,))
s.close()
#不用考虑主进程等进程池的关闭

多进程并发通信

#也不用考虑返回值接收的问题

6.回调函数(属于主进程

应用场景:爬虫

 from multiprocessing import Pool
import requests
import os
import time
def get_page(url):
print('<%s> is getting [%s]' %(os.getpid(),url))
response=requests.get(url)
time.sleep(2)
print('<%s> is done [%s]' % (os.getpid(), url))
return {'url':url,'text':response.text}
def parse_page(res):
print('<%s> parse [%s]' %(os.getpid(),res['url']))
with open('db.txt','a') as f:
parse_res='url:%s size:%s\n' %(res['url'],len(res['text']))
f.write(parse_res)
if __name__ == '__main__':
p=Pool(4)
urls = [
'https://www.baidu.com',
'http://www.openstack.org',
'https://www.python.org',
'https://help.github.com/',
'http://www.sina.com.cn/'
]
for url in urls:
p.apply_async(get_page,args=(url,),callback=parse_page)
p.close()
p.join()
print('主',os.getpid())

通常进程池的里面的任务是耗时间的,不耗时间(比进程池里的任务耗时短)的任务放到回调函数中

下载完就会调解析功能,节省时间

python-day34--进程补充的更多相关文章

  1. Python创建进程、线程的两种方式

    代码创建进程和线程的两种方式 """ 定心丸:Python创建进程和线程的方式基本都是一致的,包括其中的调用方法等,学会一个 另一个自然也就会了. "" ...

  2. 【Python】使用Supervisor来管理Python的进程

    来源 : http://blog.csdn.net/xiaoguaihai/article/details/44750073     1.问题描述 需要一个python的服务程序在后台一直运行,不能让 ...

  3. Python:进程

    由于GIL的存在,python一个进程同时只能执行一个线程.因此在python开发时,计算密集型的程序常用多进程,IO密集型的使用多线程 1.多进程创建: #创建方法1:将要执行的方法作为参数传给Pr ...

  4. python 守护进程 daemon

    python 守护进程 daemon # -*-coding:utf-8-*- import sys, os '''将当前进程fork为一个守护进程 注意:如果你的守护进程是由inetd启动的,不要这 ...

  5. 实现chrome扩展启动本地进程 - 补充

    实现chrome扩展启动本地进程 - 补充 标签: chrome扩展启动本地程序访问本地磁盘 2014-10-17 11:42 6753人阅读 评论(17) 收藏 举报  分类: Chrome Plu ...

  6. Python之进程

    进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代 ...

  7. python/数据库操作补充—模板—Session

    python/数据库操作补充—模板—Session 一.创建一个app目录 在models.py只能类进行进行创建表 class Foo: xx= 字段(数据库数据类型) 字段类型 字符串 Email ...

  8. Python的进程与线程--思维导图

    Python的进程与线程--思维导图

  9. Python之进程 3 - 进程池和multiprocess.Poll

    一.为什么要有进程池? 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务.那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?首先,创建进程需要消耗 ...

  10. {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll

    Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...

随机推荐

  1. sql study

    -- ============================================= -- Author: lifu -- Create date: 2017-06-14 -- Descr ...

  2. ArcThemALL!5.1:解压、脱壳、压缩样样精通

    原文链接:http://www.ithome.com/html/soft/57033.htm ArcThemALL!软件主要功能: 1.支持压缩和解压功能,支持常用的7z.zip.cab.iso.ra ...

  3. 20145333茹翔《网络对抗技术》Exp6 信息搜集技术

    20145333茹翔<网络对抗技术>Exp6 信息搜集技术 实验内容 本次实验的目标是掌握信息搜集的最基础技能.具体有(1)各种搜索技巧的应用(2)DNS IP注册信息的查询 (3)基本的 ...

  4. @Transactional引起的NullPointerException

    https://github.com/hengyunabc/spring-boot-inside/tree/master/demo-Transactional-NullPointerException ...

  5. E: could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporary unavailable) E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is an other process using it

    1. 问题详细提示如下: E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarly unava ...

  6. linux下如何源码安装expect

    1.作用 自动交互.比如如果用ssh登陆服务器,每次都输入密码,然而你觉得麻烦,那你就可以使用expect来做自动交互,这样的话就不用每次都输入密码 2.依赖 依赖tcl 3.获取源码 wget ht ...

  7. Zookeeper一致性协议原理Zab

    ZooKeeper为高可用的一致性协调框架,自然的ZooKeeper也有着一致性算法的实现,ZooKeeper使用的是ZAB协议作为数据一致性的算法, ZAB(ZooKeeper Atomic Bro ...

  8. 'curl' is not recognized as an internal or external command

    使用everything搜索本地的curl.exe发现如下 官网查看最新版本https://curl.haxx.se/windows/ 2019-03-06 最新版本7.64.0 curl-7.64. ...

  9. 51Nod 1344 走格子(贪心

    1344 走格子   有编号1-n的n个格子,机器人从1号格子顺序向后走,一直走到n号格子,并需要从n号格子走出去.机器人有一个初始能量,每个格子对应一个整数A[i],表示这个格子的能量值.如果A[i ...

  10. java 类构造器中加入有参构造器及调用顺序【思路】

    package com.ykmimi.new1; /** * * @author deadzq * */ public class AnyThing { public AnyThing() { thi ...