一、共享数据

进程间通信应该尽量避免使用本节所讲的共享数据方式

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

进程之间操作共享的数据

二、进程池

apply是阻塞的,apply_async是非阻塞的

close() : 禁止往进程池内再添加任务

join() 主进程阻塞,等待子进程退出

from multiprocessing import Pool
import os
import time
def task(n):
print('<%s> is running'%os.getpid())
time.sleep(2)
print('<%s> is done'%os.getpid())
return n**2
if __name__ == '__main__':
# print(os.cpu_count())
p=Pool()
for i in range(1,7):
res=p.apply(task,args=(i,))
print('本次任务的结果 :%s' %res)
print('主')

进程池1

from multiprocessing import Pool
import os
import time
import 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, 21):
obj = p.apply_async(task, args=(i,))
obj_l.append(obj)
p.close()
p.join()
print('主')
for obj in obj_l:
print(obj.get())

进程池改进版

from socket import *
from multiprocessing import Pool
s=socket(AF_INET,SOCK_STREAM)
s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
s.bind(('127.0.0.1',8090))
s.listen(5)
def talk(conn,addr):
while True: #通信循环
try:
data=conn.recv(1024)
if not data:break
conn.send(data.upper())
except Exception:
break
conn.close()
if __name__ == '__main__':
p=Pool(4)
while True:#链接循环
conn,addr=s.accept()
p.apply_async(talk,args=(conn,addr))
s.close()

进程池的应用-服务端

from socket import *
c=socket(AF_INET,SOCK_STREAM)
c.connect(('127.0.0.1',8090)) while True:
msg=input('>>: ').strip()
if not msg:continue
c.send(msg.encode('utf-8'))
data=c.recv(1024)
print(data.decode('utf-8'))
c.close()

客户端

三、回调函数

      就是由别人的函数运行期间来回调你实现的函数。

from multiprocessing import Pool
import requests
import os
def get_page(url):
print('<%s> get [%s]'%(os.getpid(),url))
respones=requests.get(url)
return {'url':url,'text':respones.text}
def parse_page(res):
print('<%s> parse [%s]' % (os.getpid(),res['url']))
with open('db.text','a') as f:
parse_page='url:%s size:%s\n'%(res['url'],len(res['text']))
f.write(parse_page)
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())

爬虫案例

四、开启线程

(1)创建线程的开销比创建进程的开销小,因而创建线程的速度快

from multiprocessing import Process
from threading import Thread
import os
import time
def work():
print('<%s> is running' %os.getpid())
time.sleep(2)
print('<%s> is done' %os.getpid()) if __name__ == '__main__':
t=Thread(target=work,)
# t=Process(target=work,)
t.start()
print('主',os.getpid())

1

(2)同一下的多个线程共享该进程的资源,而多个进程之间内存功空间是隔离的

from multiprocessing import Process
from threading import Thread
import os
import time
n=100
def work():
global n
n-=100
if __name__ == '__main__':
# p=Process(target=work,)
p=Thread(target=work,)
p.start()
p.join()
print('主',n)

python之并发编程之多进程的更多相关文章

  1. python week08 并发编程之多进程--实践部分

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

  2. python 3 并发编程之多进程 multiprocessing模块

    一 .multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...

  3. python week08 并发编程之多进程--理论部分

    一 什么是进程 进程:正在进行的一个过程或者说一个任务.       而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): Jame在一个时间段内有很多任务要做:python学习任 ...

  4. day31 python学习 并发编程之多进程理论部分

    一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): 二 进程与程序的区别 程序仅仅只是一堆代码而已,而进程指的是程序的运行 ...

  5. Python并发编程__多进程

    Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...

  6. Python进阶(4)_进程与线程 (python并发编程之多进程)

    一.python并发编程之多进程 1.1 multiprocessing模块介绍 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大 ...

  7. Python 3 并发编程多进程之进程同步(锁)

    Python 3 并发编程多进程之进程同步(锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,竞争带来的结果就是错乱,如何控制,就是加锁处理. 1. ...

  8. Python 3 并发编程多进程之守护进程

    Python 3 并发编程多进程之守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemo ...

  9. Python 3 并发编程多进程之队列(推荐使用)

    Python 3 并发编程多进程之队列(推荐使用) 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 可以往 ...

随机推荐

  1. error MSB8008: 指定的平台工具集(v110)未安装或无效。请确保选择受支持的 PlatformToolset 值

    如果你的电脑上有两个不同版本的VS,或者你的程序拷贝到别人的电脑上去运行,或者你是从别人那里拷贝来的项目,而你们俩用的VS版本不一样,就会在运行的时候出现这个问题,这个错误中的v110是VS2012使 ...

  2. Bresenham画椭圆算法

    这里不仔细讲原理,只是把我写的算法发出来,跟大家分享下,如果有错误的话,还请大家告诉我,如果写的不好,也请指出来,一起讨论进步. 算法步骤: (1) 输入椭圆的长半轴a和短半轴b. (2) 计算初始值 ...

  3. 【技术干货】听阿里云CDN安防技术专家金九讲SystemTap使用技巧

    ​1.简介 SystemTap是一个Linux非常有用的调试(跟踪/探测)工具,常用于Linux 内核或者应用程序的信息采集,比如:获取一个函数里面运行时的变 量.调用堆栈,甚至可以直接修改变量的值, ...

  4. noip普及组2004 不高兴的津津

    描述 津津上初中了.妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班.另外每周妈妈还会送她去学习朗诵.舞蹈和钢琴.但是津津如果一天上课超过八个小时就会不高兴,而且, ...

  5. 第3天:CSS浮动、定位、表格、表单总结

    今天学的是浮动.定位.表格.表单等内容,这些是CSS中最容易混淆的知识,有许多小技巧在写代码过程中需要注意.下面是主要知识点: 一.float浮动1.块元素在一行显示2.内联元素支持宽高3.默认内容撑 ...

  6. logify与theos的二三事

    最近逆向一个软件,无奈类名.方法名混淆的太厉害,class-dump后,很难猜出大致是哪个方法在起作用.用reveal 和 cycript 找到了viewcontrol 类,但类方法太多,还是不能确定 ...

  7. 80C51学习 闪烁灯

    //引入头文件 #include <reg52.h> typedef unsigned char u8; typedef unsigned int u16; //位定义 sbit LED= ...

  8. 【Linux】CentOS7无法使用tab补全功能

    公司新项目在云环境上用CentOS7搭服务器的时候,遇见了无法Tab键自动补齐的情况,上网搜了一下,是因为Centos7在使用最小化安装的时候,没有安装自动补全的包,需要自己手动安装. yum ins ...

  9. R语言安装加载包

    问题描述 在国内因为镜像的原因,直接使用:install.packages("plyr")往往无法成功添加安装包 解决办法 使用国内镜像进行安装,添加repo参数,参考如下: in ...

  10. Redis在电商中的实际应用-Java

    示例代码用Jedis编写. 1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc),Redis的命令都是原子性的,你可以轻 ...