day18.进程2
1 进程调度算法(了解)
-先来先服务调度算法
-短作业优先调度算法
-时间片轮转法
-多级反馈队列
2 同步异步,阻塞非阻塞(了解)
1 同步调用:提交了以后,一直等待结果返回
2 异步调用:提交了以后,返回一个标志,等执行完成后,有消息通知
3 同步,异步:指的是消息通知机制
4 阻塞,非阻塞:程序在等待调用结果的状态
5 同步阻塞:打电话要买书,如果电话没挂,我也一直在等待,
6 同步非阻塞:打电话买书,电话没挂,我一边干别的事,一边听一下电话
7 异步阻塞:打电话买书,电话先挂掉,过一会老板会回回来(回调),老板给回电话的过程一直在等待
8 异步非阻塞:打电话买书,电话先挂掉,过一会老板会回回来(回调),老板给回电话的过程中,在干别的事
3 Process类的参数(重点)
from multiprocessing import Process
def task(name,age):
print(name)
print(age)
if __name__ == '__main__':
# p=Process(target=task,args=['lqz',18])
# p=Process(target=task,kwargs={'age':19,'name':'lqz'},name='process01')
p=Process(target=task,kwargs={'age':19,'name':'lqz'})
p2=Process(target=task,kwargs={'age':19,'name':'lqz'})
p.start()
p2.start()
print(p.name)
print(p2.name)
# target=None, 你要执行的任务,函数
# name=None, 进程名
# args=(), 以位置参数给任务(函数)传递参数
# kwargs={} 以关键字的形式给任务(函数)传递参数
4 Process类的方法,属性(重点)
from multiprocessing import Process
import time
def task(name,age):
time.sleep(10)
print(name)
print(age)
if __name__ == '__main__':
p=Process(target=task,kwargs={'age':19,'name':'lqz'})
p.start() #启动进程,必须调用start
# p.run() # 实际进程在执行的时候,执行的是run方法,但是调用run不会开进程,后面我们另一种开启进程的方案使用到它
# p.join() # 等待子进程执行完成
print(p.is_alive()) #True
p.terminate() # 杀死p这个进程,通知操作系统去杀死该进程
time.sleep(0.1)
print(p.is_alive()) #可能还是True
print('ssss')
print(p.is_alive()) #就是False
print(p)
'''
p.start() #启动进程,必须调用start
p.run() # 实际进程在执行的时候,执行的是run方法,但是调用run不会开进程,后面我们另一种开启进程的方案使用到它
p.join() # 等待子进程执行完成
p.terminate() # 杀死p这个进程,通知操作系统去杀死该进程,并不是立即结束
p.is_alive() #进程是否还存活
'''
2.1 属性
from multiprocessing import Process
import time
def task(name,age):
time.sleep(10)
print(name)
print(age)
if __name__ == '__main__':
p=Process(target=task,kwargs={'age':19,'name':'lqz'})
# p.start()
# print(p.name) # 进程名字
# p.daemon=True #主进程结束,子进程也结束,必须在start之前调用
p.start()
print(p.pid) # 进程id号
time.sleep(10)
'''
print(p.name) # 进程名字
print(p.pid) # 进程id号
p.daemon=True #主进程结束,子进程也结束,必须在start之前调用
'''
主进程和子进程的进程号
from multiprocessing import Process
import time
import os
def task(name,age):
# 如果在任务中取出进程id号,需要使用os模块
print('当前进程(子进程)id号是:',os.getpid()) #当前进程id号
print('当前进程父进程的id号是:',os.getppid()) # 当前进程父进程的id号
time.sleep(10)
print(name)
print(age)
if __name__ == '__main__':
p=Process(target=task,kwargs={'age':19,'name':'lqz'})
p.start()
print('p这个进程的id号是:',p.pid) # 进程id号
print('当前进程id(主进程)号是:', os.getpid()) # 当前进程id号
print('当前进程父进程(pycharm)的id号是:', os.getppid()) # 当前进程父进程的id号
time.sleep(10)
'''
如果有p对象,就是用p.pid获取进程id号
如果没有p对象,就是用os模块的
os.getpid() #当前进程id号
os.getppid() #父进程id号
'''
同时开启多个进程
from multiprocessing import Process
import time
import os
# def task(name,age):
# time.sleep(10)
# print(name)
# print(age)
# def task1():
# time.sleep(2)
# print("我是task1")
#
#
# if __name__ == '__main__':
# p=Process(target=task,kwargs={'age':19,'name':'lqz'})
# p.start()
#
# p1=Process(target=task1)
# p1.start()
#
# print('主进程')
import time
def task1(i):
time.sleep(2)
print("我是task1",i)
if __name__ == '__main__':
ctime=time.time()
ll=[]
for i in range(5):
p1=Process(target=task1,args=[i,])
p1.start()
p1.join() #等待子进程执行完成
# ll.append(p1)
# for p in ll:
# p.join()
[p.join()for p in ll]
print('主进程')
print(time.time()-ctime)
'''
开启多个进程
如果想等待多个进程同时执行完,先把进程开启完成,再统一join
'''
开启进程的另一种方案
### 通过继承Process类的方式来实现,重写run方法,run方法就是你要执行的任务,实例化得到对象,调用start方法开启进程
class MyProcess(Process):
def __init__(self,name1,age):
self.name1=name1
self.age=age
# 这个必须写
super().__init__()
def run(self) :
time.sleep(2)
print(self.name)
print(self.name1)
print(self.age)
if __name__ == '__main__':
p=MyProcess('lqz',19)
p.start() #调用p.start(),不要调用run
print('主进程')
进程之间数据隔离
from multiprocessing import Process
import time
import os
def task():
print('我是task')
global n
n=100
print('子进程的:',n)
if __name__ == '__main__':
# 在主进程中定义了一个n=10
n=10
###如果这样写,n会被改掉
# task()
# print(n)
##如果这样写,n不会被改掉
p=Process(target=task)
p.start()
print('主进程的:',n)
5 高并发的tcp服务端
import socket
from multiprocessing import Process
def talk(sock,addr):
print('客户端连接成功',addr)
while True:
try:
data = sock.recv(1024)
if len(data) == 0:
break
print('从客户端收到了:', data)
sock.send(data.upper())
except Exception as e:
print(e)
break
sock.close()
if __name__ == '__main__':
server = socket.socket()
server.bind(('127.0.0.1', 81))
server.listen(5)
while True:
print('等待客户端连接')
sock, addr = server.accept()
p=Process(target=talk,args=[sock,addr])
p.start()
server.close()
from multiprocessing import Process
import time
import os
def task():
print('我是task')
global n
n=100
print('子进程的:',n)
if __name__ == '__main__':
# 在主进程中定义了一个n=10
n=10
###如果这样写,n会被改掉
# task()
# print(n)
##如果这样写,n不会被改掉
p=Process(target=task)
p.start()
print('主进程的:',n)
5 进程同步(进程锁)(次重点)
import time
## 不加锁
import json
from multiprocessing import Process,Lock
## 查询票余额
def check(i):
with open('ticket', 'rt', encoding='utf-8') as f:
res = json.load(f)
print('%s:在查询票,票还剩%s张' % (i, res['count']))
if res['count'] > 0:
return True
## 抢票,票的余额减一
def buy(i):
with open('ticket', 'rt', encoding='utf-8') as f:
res = json.load(f)
time.sleep(1) # 模拟查票延迟
if res['count'] > 0:
print('%s现在要买了,票数还是大于0'%i)
res['count'] -= 1
time.sleep(2) # 模拟买票延迟
with open('ticket', 'wt', encoding='utf-8') as f1:
json.dump(res, f1)
print('%s这个人购票成功' % i)
else:
print('%s这个人购票失败,票不够了,买不了了' % i)
def task(i,lock):
res = check(i)
if res:
lock.acquire()
buy(i)
lock.release()
##模拟10个人买票
if __name__ == '__main__':
lock=Lock()
for i in range(10):
p = Process(target=task, args=[i,lock ])
p.start()
day18.进程2的更多相关文章
- day18定时任务
day18定时任务 什么是定时任务 类似日常生活之中的闹钟:主要用于定时执行某些命令,达到定时处理数据的作用. 作用: 1.类似生活中使用的闹钟 2.可以自动完成操作命令 3.定时备份系统数据信息 定 ...
- 故障重现, JAVA进程内存不够时突然挂掉模拟
背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...
- 死磕内存篇 --- JAVA进程和linux内存间的大小关系
运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...
- 使用Monit监控本地进程
目前用它监控某些服务,失败自动重启,同时监控特定的日志文件,如果有变化,就发邮件报警 安装不细写了,网上好多 我先用cat /proc/version看了下我的系统是el6的,于是wget http: ...
- [APUE]进程控制(上)
一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是init进程,在自举(bootstr ...
- [APUE]UNIX进程的环境(下)
一.共享库 共享库使得可执行文件中不再需要包含常用的库函数,而只需在所有进程都可存取的存储区中保存这种库例程的一个副本.程序第一次执行的时候或第一次调用某个库函数的时候,用动态链接方法将程序与共享库函 ...
- Tomcat shutdown执行后无法退出进程问题排查及解决
问题定位及排查 上周无意中调试程序在Linux上ps -ef|grep tomcat发现有许多tomcat的进程,当时因为没有影响系统运行就没当回事.而且我内心总觉得这可能是tomcat像nginx一 ...
- 查看w3wp进程占用的内存及.NET内存泄露,死锁分析
一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...
- 探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)
其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...
随机推荐
- MVVM中的vm双向监听和mvc的缺点
`MVVM`模型: - 即Model,模型,包括数据和一些基本操作 - 即View,视图,页面渲染结果- 即View-Model,模型与视图间的双向操作(无需开发人员干涉) `MVVM`中的`VM`要 ...
- kvm-PLE代码分析
Linux源码版本: 5.3.0 相关数据结构 #define KVM_DEFAULT_PLE_GAP 128 // ple_gap #define KVM_VMX_DEFAULT_PLE_WINDO ...
- Java8 关于stream.foreach()和stream.peek()的区别解析
该思考来源于日常工作中,特记此心得. 思考:如何快速将list中的每个item内部属性值改变并进行其他流体操作呢? 下面做个测试:如何先在list中统一改变某属性的值,然后再根据某个属性取出该属性值最 ...
- 使用gitlab构建基于docker的持续集成(二)
使用gitlab构建基于docker的持续集成(二) gitlab docker aspnetcore Centos配置gitlab镜像并且启动 Centos配置防火墙 windows上访问gitla ...
- Java基础自学小项目
实现一个基于文本界面的<家庭记账软件> 需求:能够记录家庭的收入,支出,并能够收支明细表 主要涉及一下知识点: - 局部变量和基本数据类型 - 循环语句 - 分支语句 - 方法调用和返回值 ...
- AXU2CGB开发板验证Vitis加速基本平台创建
Vitis 加速基本平台创建 1.Vivado 工程创建,硬件平台bd 图如下所示 1.1.双击Block图中ZYNQ核,配置相关参数 1.1.1.Low Speed 配置,在 I/O Configu ...
- 机器学习系统或者SysML&DL笔记(一)
前言 在使用过TVM.TensorRT等优秀的机器学习编译优化系统以及Pytorch.Keras等深度学习框架后,总觉得有必要从理论上对这些系统进行一些分析,虽然说在实践中学习是最快最直接的(指哪儿打 ...
- Hi3559AV100 NNIE开发(2)-RFCN(.wk)LoadModel及NNIE Init函数运行过程分析
之后随笔将更多笔墨着重于NNIE开发系列,下文是关于Hi3559AV100 NNIE开发(2)-RFCN(.wk)LoadModel及NNIE Init函数运行过程分析,通过对LoadModel函数及 ...
- The League of Sequence Designers Gym - 102460E
题目链接:https://vjudge.net/problem/Gym-102460E 思路:求: 题目当中给了一段伪代码算法,仔细一看发现它是不会记录负数情况,所以与正确答案会有误差,现在题目给定K ...
- P1996_约瑟夫问题(JAVA语言)_可能是最简单的解法了!
思路:使用队列模拟. 判断是否为出圈的数.如果不是,把数加入队列尾部:如果是,输出并删除. 题目背景 约瑟夫是一个无聊的人!!! 题目描述 n个人(n<=100)围成一圈,从第一个人开始报数,数 ...