python之并发编程之多进程
一、共享数据
进程间通信应该尽量避免使用本节所讲的共享数据方式
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之并发编程之多进程的更多相关文章
- python week08 并发编程之多进程--实践部分
一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...
- python 3 并发编程之多进程 multiprocessing模块
一 .multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程. ...
- python week08 并发编程之多进程--理论部分
一 什么是进程 进程:正在进行的一个过程或者说一个任务. 而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): Jame在一个时间段内有很多任务要做:python学习任 ...
- day31 python学习 并发编程之多进程理论部分
一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行): 二 进程与程序的区别 程序仅仅只是一堆代码而已,而进程指的是程序的运行 ...
- Python并发编程__多进程
Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...
- Python进阶(4)_进程与线程 (python并发编程之多进程)
一.python并发编程之多进程 1.1 multiprocessing模块介绍 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大 ...
- Python 3 并发编程多进程之进程同步(锁)
Python 3 并发编程多进程之进程同步(锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,竞争带来的结果就是错乱,如何控制,就是加锁处理. 1. ...
- Python 3 并发编程多进程之守护进程
Python 3 并发编程多进程之守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemo ...
- Python 3 并发编程多进程之队列(推荐使用)
Python 3 并发编程多进程之队列(推荐使用) 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的. 可以往 ...
随机推荐
- SQL 模糊查询
在进行数据库查询时,有完整查询和模糊查询之分.一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式:1,%:表示任意0个 ...
- c#获取数组中最大的元素
, , , , , , , , , }; var max = array.Max();//获取数组中的最大值 第一种 //第二种方法 ]; ; i < array.Length; i++) { ...
- Eclipse安装Hibernate插件快速生成配置文件
Eclipse安装Hibernate插件快速生成配置文件 插件链接: http://pan.baidu.com/s/1mi3KVtI 密码: kmjg 1.安装插件: 1.在eclipse顶部窗口he ...
- php Yii2图片的url自动加localhost
解决方法:在地址前加http://,这样url就是绝对地址,不加的话是相对地址,游览器会自动转换,即加localhost
- 33、线程与全局解释器锁(GIL)
之前我们学了很多进程间的通信,多进程并发等等,今天我们来学习线程,线程和进程是什么关系,进程和线程有什么相同而又有什么不同今天就来揭晓这个答案. 一.线程概论 1.何为线程 每个进程有一个地址空间,而 ...
- 也来谈谈IT培训
园子里这篇博客火了:谈谈培训机构的"骗局"给新人一些建议,刚好我也一直被问到这个话题,今天就凑个热闹,一吐为快吧. 我从包工头转行做开发,是进了培训班的,但两年的课程,我只学了半年 ...
- mysql简单主从复制(二)
mysql的简单主从复制 主从复制打开后,各自开启的线程: master端 mysql> show processlist\G; *************************** 1. r ...
- JavaSE(八)之集合概述
前几天其实一直在学习关于linux的内容和kvm虚拟化的知识.今天有时间来回顾一下集合相关的知识,接下来我将带大家一起来回顾一起集合关联的知识. 不要辜负自己花费时间做的事情,只有用心才能得到真心的回 ...
- Myeclipse去掉恶心的弹框
错误提示: 解决方法: 把JavaScript Validator去掉.去掉的方法是:选择一个项目—-右键Properties—-Builders(排第二)—-点一下右侧会有四项—-取消第一项“Jav ...
- ref与out的区别、冒泡排序、普通排序,以及二分法查询
一.首先我们先讲一下ref与out的区别和使用方法: 1.ref与out的区别: out:需要在使用前声明变量,分配地址但不能赋值,但是需要在使用中的时候需要初始化(进入方法体中的时候需要先赋值在使用 ...