Day9 进程同步锁 进程队列 进程池 生产消费模型 进程池 paramike模块
进程同步锁:
当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢?
其实也就是相当于让进程独享资源。
from multiprocessing import Process,Lock #引用函数
import time
def work(name,mutex):
mutex.acquire() #在这里加入锁
print('task <%s> is runing' %name)
time.sleep(2)
print('task <%s> is done' % name)
mutex.release() #加完锁以后必须需要解锁 if __name__ == '__main__':
mutex=Lock()
p1=Process(target=work,args=('egon',mutex))
p2=Process(target=work,args=('alex',mutex))
p1.start()
p2.start()
print('主')
比如说模拟抢票的功能:
要先写一个文本 ("count":1) 就记个数就行
import json
import os
import time
from multiprocessing import Process,Lock
def search():
dic=json.load(open('db.txt'))
print('\033[32m[%s] 看到剩余票数<%s>\033[0m' %(os.getpid(),dic['count']))
def get_ticket():
dic = json.load(open('db.txt'))
time.sleep(0.5) #模拟读数据库的网络延迟
if dic['count'] > 0:
dic['count']-=1
time.sleep(0.5) # 模拟写数据库的网络延迟
json.dump(dic,open('db.txt','w'))
print('\033[31m%s 购票成功\033[0m' %os.getpid())
def task(mutex):
search()
mutex.acquire()
get_ticket()
mutex.release()
if __name__ == '__main__':
mutex=Lock()
for i in range(10):
p=Process(target=task,args=(mutex,))
p.start()
进程队列:
共享内存的方式:
from multiprocessing import Process,Manager,Lock #Manager共享内存函数 def task(dic,mutex):
with mutex:
dic['count']-=1 if __name__ == '__main__':
mutex=Lock()
m=Manager()
dic=m.dict({'count':100})
p_l=[]
for i in range(100):
p=Process(target=task,args=(dic,mutex))
p_l.append(p)
p.start() for p in p_l:
p.join()
print(dic)
队列:
进程彼此之间隔离,要实现进程间通信
from multiprocessing import Queue #引用函数
q=Queue(3) #意味着你队列长队最大为三 q.put('first')
q.put('second')
q.put('third')
# q.put('fourth') #满了的话会一直卡住 print(q.get())
print(q.get())
print(q.get())
print(q.get()) #了解
# q=Queue(3)
#
# q.put('first',block=False)
# q.put('second',block=False)
# q.put('third',block=False) #这样的话队列满了就会抛出异常,不会卡在这里
# # q.put_nowait('fourth')
21 #q.put('fourth',block=False)
# q.put('fourth',timeout=3) #指定抛出时间,如果3秒后队列还是满的抛出异常
生产者消费者模型:
正常情况下,一般都是生产者预先生产出商品,然后等着消费者来买。
(实际情况可能是有多个生产者,多个消费者)
from multiprocessing import Process, JoinableQueue
import time, os def producer(q, name):
for i in range():
time.sleep()
res = '%s%s' % (name, i)
q.put(res)
print('\033[45m<%s> 生产了 [%s]\033[0m' % (os.getpid(), res))
q.join() #对应下边的task_done def consumer(q):
while True:
res = q.get()
time.sleep(1.5)
print('\033[34m<%s> 吃了 [%s]\033[0m' % (os.getpid(), res))
q.task_done() #代表我这个进程我已经取走了,发给生产者,对应生产者要有个jion() if __name__ == '__main__':
q = JoinableQueue() # 生产者们:即厨师们
p1 = Process(target=producer, args=(q, '包子'))
p2 = Process(target=producer, args=(q, '饺子'))
p3 = Process(target=producer, args=(q, '馄饨')) # 消费者们:即吃货们
c1 = Process(target=consumer, args=(q,))
c2 = Process(target=consumer, args=(q,)) c1.daemon=True #如果消费者不取完的话,程序无法结束
c2.daemon=True #这里主进程运行完,子进程要结束掉
p1.start()
p2.start()
p3.start()
c1.start()
c2.start() p1.join() print('主')
进程池:
from multiprocessing import Pool
import os,time def work(n):
print('task <%s> is runing' %os.getpid())
time.sleep(2)
return n**2
if __name__ == '__main__':
# print(os.cpu_count())
p=Pool(4) #定义进程池的大小,如果不定义一般是内核数
# for i in range(10):
# res=p.apply(work,args=(i,)) #向进程池里边添加进程,同步提交
# print(res) res_l=[]
for i in range(10):
res=p.apply_async(work,args=(i,)) #向进程池异步提交,只管扔进去,不管是否执行完成
res_l.append(res) p.close()
p.join()
#
# for res in res_l:
# print(res.get())
进程池之回调函数:
需要回调函数的场景,进程池中任何一个任务一旦处理完成,就立即告诉主进程,我好了,你可以处理我的结果了,主进程调用一个函数去处理该结果,该函数即回调函数。
import requests #pip3 install requests
import os,time
from multiprocessing import Pool
def get_page(url):
print('<%s> get :%s' %(os.getpid(),url))
respone = requests.get(url)
if respone.status_code == 200:
return {'url':url,'text':respone.text} def parse_page(dic):
print('<%s> parse :%s' %(os.getpid(),dic['url']))
time.sleep(0.5)
res='url:%s size:%s\n' %(dic['url'],len(dic['text'])) #模拟解析网页内容
with open('db.txt','a') as f:
f.write(res) if __name__ == '__main__':
p=Pool(4)
urls = [
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
] for url in urls:
p.apply_async(get_page,args=(url,),callback=parse_page) p.close()
p.join()
print('主进程pid:',os.getpid())
paramike模块:
paramike模块是一个用作做远程控制的模块,使用该模块可以对远程服务器进行命令或者文件操作。值得一提的是,fabric和ansible内部的远程管理就是使用的paramike模块。
#需要下载安装
#pip3 install paramiko
远程连接功能:
import paramiko # 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='120.92.84.249', port=22, username='root', password='123QWEasd') # 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()
print(result.decode('utf-8'))
# 关闭连接
ssh.close()
这是基于账号密码来访问客户端的。
另外一种方式是基于秘钥的,
现在服务端制作一个秘钥,ssh-keygen制作秘钥,sz可以下载到window桌面。
客户端要用,肯定要基于服务端有认证文件,利用 ssh-copy-id -i 用户@ip
import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa') #秘钥的文件位置 # 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='120.92.84.249', port=22, username='root', pkey=private_key) # 执行命令
stdin, stdout, stderr = ssh.exec_command('df')
# 获取命令结果
result = stdout.read()
print(result.decode('utf-8'))
# 关闭连接
ssh.close()
上传下载:
import paramiko transport = paramiko.Transport(('120.92.84.249', 22))
transport.connect(username='root', password='123QWEasd') sftp = paramiko.SFTPClient.from_transport(transport)
# 将location.py 上传至服务器 /tmp/test.py
sftp.put('id_rsa', '/tmp/test.rsa')
# 将remove_path 下载到本地 local_path
# sftp.get('remove_path', 'local_path') transport.close()
Day9 进程同步锁 进程队列 进程池 生产消费模型 进程池 paramike模块的更多相关文章
- Python并发编程-生产消费模型
生产消费模型初步 #产生两个子进程,Queue可以在子进程之间传递消息 from multiprocessing import Queue,Process import random import t ...
- Python学习之路并发编程--信号量、事件、队列及生产消费模型
1. 信号量 对于多进程来说,多个进程同时修改数据,就可能出现安全隐患,所以引入了锁,这一机制,但锁只能有一把来控制一个的开关,当你需要几把锁的时候,就可能用到信号量的概念.他是用了锁的原理,内置了一 ...
- 并发编程:生产消费模型、死锁与Rlock、线程、守护线程、信号量、锁
一.生产者消费者模型1 二.生产者消费者模型2 三.守护线程 四.常用方法 五.启动线程的另一种方式 六.锁 七.锁死 八.死锁 九.单个锁能不能死锁 十.信号旗 一.生产者消费者模型1 import ...
- 并发编程: 生产消费模型、死锁与Rlock、线程、守护线程、信号量、锁
一.守护进程 二.互斥锁 三.抢票 四.进程间通讯 五.进程间通讯2 一.守护进程 """ 进程间通讯的另一种方式 使用queue queue 队列 队列的特点: 先进的 ...
- 队列 Queue 与 生产者消费模型
队列:先进先出 # from multiprocessing import Queue # Q = Queue(4) # Q.put('a') # Q.put('b') # Q.put('b') # ...
- RocketMQ生产消费模型选择
一. 生产者,根据某个标识将消息放到同一个队列中 在发送消息时,使用SelectMessageQueueByHash,该类根据传入进去的arg,进行hash计算,将消息分配到相应的队列中. publi ...
- Spring整合ActiveMQ,实现队列主题消息生产消费
1.引入依赖 pom.xml 1 <!-- activemq --> 2 <dependency> 3 <groupId>org.springframework&l ...
- 初识Kafka:构架、生产消费模型以及其他相关概念
当前使用的事件总线采用的是Kafka分布式消息队列来完成的,近来项目需要接入到事件总线中,故开启了kafka的学习之旅(之前一直在听说kafka这玩意儿,但是学习计划中还没有将它安排进去,借着这个机会 ...
- JAVA 多线程制作大球吃小球 一、实现球的自动生成及运动 生产消费模型
前几天用多线程实现了创建小球并移动,想到大鱼吃小鱼,便突发奇想要写一个大球吃小球.首先第一步自然是先把界面弄好啦 public class BallUI extends JPanel { privat ...
随机推荐
- 最简单的基于FFmpeg的内存读写的例子:内存播放器
===================================================== 最简单的基于FFmpeg的内存读写的例子系列文章列表: 最简单的基于FFmpeg的内存读写的 ...
- Docker教程:dokcer的配置和命令
http://blog.csdn.net/pipisorry/article/details/50803028 Docker命令查询 终端运行docker命令,它会打印所有可用的命令列表及使用描述:# ...
- Mybatis源码之Statement处理器StatementHandler(一)
StatementHandler通过类名我们可以了解到它可能是Statement的处理器,它是一个接口,其实现类如下: BaseStatementHandler:一个抽象类,只是实现了一些不涉及具体操 ...
- iOS编程中的音频知识(二):那么多种格式我应该用哪一个?
iPhone支持不少格式,比如AAC,HE-AAC,AMR,IMA4等等,你可以在以下网址看到比较全的格式和简要介绍: http://www.raywenderlich.com/69365/audio ...
- 在ROS(indigo)中读取手机GPS用于机器人定位~GPS2BT在ubuntu和window系统下的使用方法~
在ROS(indigo)中读取手机GPS用于机器人定位~GPS2BT在ubuntu和window系统下的使用方法~ 不需要额外购买GPS设备. 将手机GPS数据通过蓝牙传输给计算机使用,当然通过类似方 ...
- 纸飞机AE小教程
- log4j的一些配置
a). 新建Java Project>>新建package>>新建java类: b). import jar包(一个就够),这里我用的是log4j-1.2.14.jar, c) ...
- HashMap与HashTable面试宝典
u012233832的专栏 初生牛犊 目录视图 摘要视图 订阅 写博客,送money.送书.送C币啦 7-8月博乐推荐文章 砸BUG 得大奖 100%中奖率 微信开发学习路线高级篇上线 ...
- java工具类(三)之生成若干位随机数
java 生成若干位随机数的问题 在一次编程的过程中偶然碰到一个小问题,就是需要生成一个4位数的随机数,如果是一个不到4位大的数字,前面可以加0来显示.因为要求最后是一个4位的整数,不带小数点.当时就 ...
- 如何优化你的布局层级结构之RelativeLayout和LinearLayout及FrameLayout性能分析
转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/51159419 如何优化你的布局层级结构之RelativeLayout和LinearLa ...