进程同步锁:

当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢?

其实也就是相当于让进程独享资源。

 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模块的更多相关文章

  1. Python并发编程-生产消费模型

    生产消费模型初步 #产生两个子进程,Queue可以在子进程之间传递消息 from multiprocessing import Queue,Process import random import t ...

  2. Python学习之路并发编程--信号量、事件、队列及生产消费模型

    1. 信号量 对于多进程来说,多个进程同时修改数据,就可能出现安全隐患,所以引入了锁,这一机制,但锁只能有一把来控制一个的开关,当你需要几把锁的时候,就可能用到信号量的概念.他是用了锁的原理,内置了一 ...

  3. 并发编程:生产消费模型、死锁与Rlock、线程、守护线程、信号量、锁

    一.生产者消费者模型1 二.生产者消费者模型2 三.守护线程 四.常用方法 五.启动线程的另一种方式 六.锁 七.锁死 八.死锁 九.单个锁能不能死锁 十.信号旗 一.生产者消费者模型1 import ...

  4. 并发编程: 生产消费模型、死锁与Rlock、线程、守护线程、信号量、锁

    一.守护进程 二.互斥锁 三.抢票 四.进程间通讯 五.进程间通讯2 一.守护进程 """ 进程间通讯的另一种方式 使用queue queue 队列 队列的特点: 先进的 ...

  5. 队列 Queue 与 生产者消费模型

    队列:先进先出 # from multiprocessing import Queue # Q = Queue(4) # Q.put('a') # Q.put('b') # Q.put('b') # ...

  6. RocketMQ生产消费模型选择

    一. 生产者,根据某个标识将消息放到同一个队列中 在发送消息时,使用SelectMessageQueueByHash,该类根据传入进去的arg,进行hash计算,将消息分配到相应的队列中. publi ...

  7. Spring整合ActiveMQ,实现队列主题消息生产消费

    1.引入依赖 pom.xml 1 <!-- activemq --> 2 <dependency> 3 <groupId>org.springframework&l ...

  8. 初识Kafka:构架、生产消费模型以及其他相关概念

    当前使用的事件总线采用的是Kafka分布式消息队列来完成的,近来项目需要接入到事件总线中,故开启了kafka的学习之旅(之前一直在听说kafka这玩意儿,但是学习计划中还没有将它安排进去,借着这个机会 ...

  9. JAVA 多线程制作大球吃小球 一、实现球的自动生成及运动 生产消费模型

    前几天用多线程实现了创建小球并移动,想到大鱼吃小鱼,便突发奇想要写一个大球吃小球.首先第一步自然是先把界面弄好啦 public class BallUI extends JPanel { privat ...

随机推荐

  1. OC可点击的两种轮播图效果

    基本上,每一个APP都有一个轮播图的效果展示,一般都是用来展示图片的一些信息,然后可以点击查看或购买,所以在此我将这种轮播图进行了一个类的封装,效果包含两种形式:第一种,来回轮转样式,第二种,一个方向 ...

  2. 四大组件之Service小结

    总结提高,与君共勉! 1.Service是什么 Service 是看不到界面的,,就是一个没有界面的Activity, 并且长期在后台运行的一个组件.. 由于ANR对Activity和Broadcas ...

  3. 04_Weblogic之受管服务器:配置受管服务器,启动受管服务器,解决因为强制关闭Weblogic之后导致启动有问题的问题,配置boot.properties

     配置受管服务器, 先启动WebLogic服务器,启动方式如下: 在WebLogic控制台中的"开发模式"---"锁定并编辑"模式下,点击"Ser ...

  4. jdbc连接sql数据库

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口 ...

  5. Leetcode_6_ZigZag Conversion

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41408021 看完这篇文章,你可能会学到到知识如下: (1 ...

  6. 高性能C++网络库libtnet实现:IOLoop

    IOLoop libtnet采用的是prefork + event loop的架构方式,prefork就是server在启动的时候预先fork多个子进程同时工作,而event loop则是基于epol ...

  7. JAVA之旅(五)——this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块

    JAVA之旅(五)--this,static,关键字,main函数,封装工具类,生成javadoc说明书,静态代码块 周末收获颇多,继续学习 一.this关键字 用于区分局部变量和成员变量同名的情况 ...

  8. Opencv学习笔记------Harris角点检测

    image算法测试iteratoralgorithmfeatures 原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/73 ...

  9. 漫谈程序员(十一)老鸟程序员知道而新手不知道的小技巧之Web 前端篇

    老鸟程序员知道而新手不知道的小技巧 Web 前端篇 常充电!程序员只有一种死法:土死的. 函数不要超过50行. 不要一次性写太多来不及测的代码,而是要写一段调试一段. UI和编码要同步做. 多写注释方 ...

  10. iOS中UITableView分割线左侧顶齐

    iOS 7开始UITableView的分割线不在从左侧边界开始了,而是默认空出了一段距离. 如果想要使用默认的分割线而且还要从左侧边界开始的话,有几种解决方式: 1.在tableView的代理方法中设 ...