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

  1. day18定时任务

    day18定时任务 什么是定时任务 类似日常生活之中的闹钟:主要用于定时执行某些命令,达到定时处理数据的作用. 作用: 1.类似生活中使用的闹钟 2.可以自动完成操作命令 3.定时备份系统数据信息 定 ...

  2. 故障重现, JAVA进程内存不够时突然挂掉模拟

    背景,服务器上的一个JAVA服务进程突然挂掉,查看产生了崩溃日志,如下: # Set larger code cache with -XX:ReservedCodeCacheSize= # This ...

  3. 死磕内存篇 --- JAVA进程和linux内存间的大小关系

    运行个JAVA 用sleep去hold住 package org.hjb.test; public class TestOnly { public static void main(String[] ...

  4. 使用Monit监控本地进程

    目前用它监控某些服务,失败自动重启,同时监控特定的日志文件,如果有变化,就发邮件报警 安装不细写了,网上好多 我先用cat /proc/version看了下我的系统是el6的,于是wget http: ...

  5. [APUE]进程控制(上)

    一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是init进程,在自举(bootstr ...

  6. [APUE]UNIX进程的环境(下)

    一.共享库 共享库使得可执行文件中不再需要包含常用的库函数,而只需在所有进程都可存取的存储区中保存这种库例程的一个副本.程序第一次执行的时候或第一次调用某个库函数的时候,用动态链接方法将程序与共享库函 ...

  7. Tomcat shutdown执行后无法退出进程问题排查及解决

    问题定位及排查 上周无意中调试程序在Linux上ps -ef|grep tomcat发现有许多tomcat的进程,当时因为没有影响系统运行就没当回事.而且我内心总觉得这可能是tomcat像nginx一 ...

  8. 查看w3wp进程占用的内存及.NET内存泄露,死锁分析

    一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...

  9. 探索ASP.NET MVC5系列之~~~6.Session篇(进程外Session)

    其实任何资料里面的任何知识点都无所谓,都是不重要的,重要的是学习方法,自行摸索的过程(不妥之处欢迎指正) 汇总:http://www.cnblogs.com/dunitian/p/4822808.ht ...

随机推荐

  1. C#从1970年开始到现在时间的总秒数

    TimeSpan timeSpan = (DateTime.UtcNow - new DateTime(1970, 1, 1)); string timeStamp = ((int)timeSpan. ...

  2. Gateway网关

    前提要在注册中心把网关和服务都进行注册 通俗来说,网关就是指在客户端和服务端的一面墙,这面墙有请求转发,负载均衡,权限控制,跨域,熔断降级,限流保护等功能. 客户端发送请求,请求先通过网关,网关根据特 ...

  3. 为什么数据库能查出两条id相同的数据

    sql如下: SELECT t.*,d.name as "workName" FROM t_traceability_slice t LEFT JOIN sys_departmen ...

  4. 看动画轻松学会 Raft 算法

    由于 Paxos 算法过于晦涩难懂且难以实现,Diego Ongaro 提出了一种更易于理解和实现并能等价于 Paxos 算法的共识算法 - Raft 算法. 因为 Raft 算法清晰易懂越来越多的开 ...

  5. PTA甲级—数学

    1.简单数学 1008 Elevator (20分) 模拟题 #include <cstdio> #include <cstring> #include <string& ...

  6. 01----python入门----python安装与初识

    ----python入门----python安装与初识 python是一门编程语言,作为学习python的开始,需要事先搞明白:编程的目的是什么?什么是编程语言?什么是编程? 这是一个很好的开头!但是 ...

  7. 测试平台系列(3) 给Hello World添加日志

    给Hello World添加日志 回顾 通过上篇内容,我们已经使用「Flask」完成了我们的第一个接口.我们可以看到,使用「Flask」来编写接口是十分简单的.那么接下来,我们丰富一下上面的例子. 需 ...

  8. subprocess如何设置命令超时时间

    一.subprocess如何设置命令超时时间 最近遇到一个问题,就是我需要在服务器上执行某些shell命令,但是有些命令失败的时候是不会自动终止的,只会一直停在那里,很耗时间. 因此想到了设置超时时间 ...

  9. 解析分布式应用框架Ray架构源码

    摘要:Ray的定位是分布式应用框架,主要目标是使能分布式应用的开发和运行. Ray是UC Berkeley大学 RISE lab(前AMP lab) 2017年12月 开源的新一代分布式应用框架(刚发 ...

  10. Envoy 部署类型

    目录 Envoy 网络拓扑及请求流程 1. 术语 2. 网络拓扑 3. 配置 4. 更高层的架构 5. 请求流程 1. Listener TCP 接收 2. 侦听器过滤器链和网络过滤器链匹配 3.TL ...