python--进程内容补充
一. 进程的其他方法
进程id, 进程名字, 查看进程是否活着(is_alive()), terminate()发送结束进程的信号
import time
import os
from multiprocessing import Process def f1():
print('子进程的pid',os.getpid())
print('降龙十八掌天下第一')
def f2():
print('六脉神剑举世无双') if __name__ == '__main__':
p1 = Process(target=f1,name='我是进程1')
p2 = Process(target=f2,)
p1.start()
p2.start()
print(p1.name) # 我是进程1
print('子进程的pid',p1.pid)
print('父进程的id',os.getpid()) def f1():
time.sleep(3)
print('子进程1号') if __name__ == '__main__':
p = Process(target=f1,)
p.start()
print(p.is_alive()) # True, 判断进程是否活着
p.terminate() # 给系统发送一个结束进程的信号
time.sleep(0.5) # 为了让避免并发导致的下面结果不准
print(p.is_alive()) # False
二 . 僵尸进程和孤儿进程(了解)
僵尸进程可以理解为一些进程垃圾, 没有实际作用, 但是在占用着空间, 当这些进程的父进程正常关闭的时候会清楚这些僵尸进程,
孤儿进程也是一些进程垃圾, 只不过是当父进程非正常关闭的时候, 这些垃圾需要被最上级进程清理.
三 . 验证进程之间是空间隔离的
from multiprocessing import Process
num = 100
def f1():
global num
num = 3
print('子进程中的num',num) if __name__ == '__main__':
p = Process(target=f1,)
p.start() # 子进程中的num 3
p.join()
print('主进程中的num',num) # 主进程中的num 100
五 . 守护进程
import time
from multiprocessing import Process def f1():
time.sleep(1)
print('我是沉睡1秒的子进程')
time.sleep(3)
print('我是沉睡3秒子进程') # 打印不出来
def f2():
time.sleep(1)
print('我是普通的子进程') if __name__ == '__main__':
p = Process(target=f1,)
# 将该进程设置为守护进程,必须写在start之前,
# 意思如果我的主进程代码运行结束了,你这个子进程不管运行到什么地方,都直接结束
p.daemon = True
p.start()
# 开启一个普通的子进程来验证一下守护进程的结束只和主进程的代码运行结束有关系,
# 而整个程序的结束需要主进程和普通的子进程的代码都运行结束才结束
p2 = Process(target=f2,)
p2.start()
time.sleep(2)
print('====','我是主进程')
# f1 只能打印出我是沉睡1秒的子进程,
# 主进程打印出==== 我是主进程,然后打印出我是普通的子进程
六 . 进程锁(同步锁/互斥锁) (非常重要)
保证了数据安全,但是牺牲了效率,假锁的这段代码变成了(同步)串行执行的状态
进程锁就是为了保证数据安全, 比如说抢票如果只剩一张票的话,很多人同时访问都能看到只剩一张票,如果不用进程锁的数据就会发生错误.
import time
from multiprocessing import Process,Lock
def show_ticket(i):
with open('ticket','r',encoding='utf-8') as f:
ticket_data = f.read() # 文件中的数据{'count': 1}
t_data = eval(ticket_data)
print('%s查询剩余票数为%s'%(i,t_data['count']))
def get_ticket(i,l1):
# 上锁,所有人只能抢这一个锁,只有抢到了才能继续执行,避免了由于并发导致的数据不准
l1.acquire()
with open('ticket', 'r', encoding='utf-8') as f:
ticket_data = f.read()
# print(ticket_data)
t_data = eval(ticket_data)
if t_data['count'] > 0:
t_data['count'] -= 1
print('%s抢票成功' % i)
time.sleep(0.2)
with open('ticket', 'w',) as f:
f.write(str(t_data))
else:
print('没票了!!!')
# 解锁,解锁之后才能重新抢锁
l1.release()
if __name__ == '__main__':
l1 = Lock()
for i in range(10):
p1 = Process(target=show_ticket,args=(i,))
p1.start()
for i in range(10):
p2 = Process(target=get_ticket,args=(i,l1) )
p2.start() def f1(i,lic):
with lic: # 直接完成了上锁与解锁的过程
time.sleep(1)
print(i) if __name__ == '__main__':
lic = Lock()
for i in range(5):
p = Process(target=f1, args=(i,lic))
p.start()
六 . 队列
from multiprocessing import Process,Queue
q = Queue(3)
q.put('乔峰')
q.put('段誉')
q.put('虚竹')
print(q.get())
print(q.get())
print(q.get())
try:
# 为了不等待直接执行下面的代码 如果是q.get()程序就会在这一直等着直到再次出现q.put()
q.get_nowait()
except:
print('队列拿空了')
print('还有东西吗?') # 基于队列的通信
def f1(q):
q.put('约不约?')
if __name__ == '__main__':
q = Queue(3)
p = Process(target=f1,args=(q,))
p.start()
son_p_msg = q.get()
print('来自子进程的消息:', son_p_msg) # 来自子进程的消息: 约不约?
七 . 基于队列的生产者消费者模型
import time
from multiprocessing import Process,Queue,JoinableQueue
def producer(q):
for i in range(10):
time.sleep(0.2)
s = '大包子%s号' % i
print('新鲜出炉' + s)
q.put(s)
# 这个q.join 是 JoinableQueue 里面的join
q.join() #就等着task_done()信号的数量,和我put进去的数量相同时,才继续执行
print('所有的任务都被处理了,继续潜行吧骚年们') def consumer(q):
while 1:
time.sleep(0.5)
baozi = q.get()
print(baozi+'被吃了')
q.task_done() #给队列发送一个取出的这个任务已经处理完毕的信号 if __name__ == '__main__':
q = JoinableQueue(30) #同样是一个长度为30的队列
pro_p = Process(target=producer,args=(q,))
con_p = Process(target=consumer,args=(q,))
pro_p.start()
# 为了让消费者吃完包子就走人
con_p.daemon = True
con_p.start()
# 这个join 是 process里面的join
pro_p.join()
print('主进程结束') ### 这两个join在两个模块里,功能不一样
进程id,进程名字,查看进程是否活着is_alive() terminate()发送结束进程的信号
python--进程内容补充的更多相关文章
- python之路--进程内容补充
一. 进程的其他方法 进程id, 进程名字, 查看进程是否活着(is_alive()), terminate()发送结束进程的信号 import time import os from multipr ...
- python2.0 s12 day8 _ python线程&python进程
1.进程.与线程区别2.cpu运行原理3.python GIL全局解释器锁4.线程 1.语法 2.join 3.线程锁之Lock\Rlock\信号量 4.将线程变为守护进程 5.Event事件 6.q ...
- python 全栈开发,Day93(vue内容补充,VueX)
昨日内容回顾 1. 页面的布局 Vue中使用Bootstrap搭页面 1. 安装 1. npm install bootstrap@3.3.7 -S 2. 使用 1. import 'bootstra ...
- 初步理解Python进程的信号通讯
Reference: http://www.jb51.net/article/63787.htm 信号的概念 信号(signal)-- 进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信 ...
- python——进程基础
我们现在都知道python的多线程是个坑了,那么多进程在这个时候就变得很必要了.多进程实现了多CPU的利用,效率简直棒棒哒~~~ 拥有一个多进程程序: #!/usr/bin/env python #- ...
- 使用gdb调试Python进程
使用gdb调试Python进程 有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump.例如现在遇到一个mod_wsgi的进程僵死了,不接受请求,想看看究竟是运行到 ...
- python/数据库操作补充—模板—Session
python/数据库操作补充—模板—Session 一.创建一个app目录 在models.py只能类进行进行创建表 class Foo: xx= 字段(数据库数据类型) 字段类型 字符串 Email ...
- python进程、进程池(二)代码部分
第一种创建进程的方式: from multiprocessing import Process def f(name): print(name,"在子进程") if __name_ ...
- Python 进程之间共享数据
最近遇到多进程共享数据的问题,到网上查了有几篇博客写的蛮好的,记录下来方便以后查看. 一.Python multiprocessing 跨进程对象共享 在mp库当中,跨进程对象共享有三种方式,第一种 ...
- python 进程和线程(代码知识部分)
二.代码知识部分 一 multiprocessing模块介绍: python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情 ...
随机推荐
- salt命令
salt-key -L list在master上所有收到的公钥连接请求 -A accept所有pending的请求. -D 删除所有 在minion上启动服务后,几十秒后会在/etc/salt/pki ...
- ZSP12项目的总结
前言:一款测量仪器做出来容易,想好做好还是需要投入更多的时间和心血. 项目概述:硬件已经定型,在C8051F020基础上的软件开发. 一 关于C8051F单片机:虽然自己整过8051单片机,但那已经是 ...
- jsp第一章 动态网页开发基础
动态网站可以实现交互功能,如用户注册.信息发布.产品展示.订单管理等等: 动态网页并不是独立存在于服务器的网页文件,而是浏览器发出请求时才反馈网页: 动态网页中包含有服务器端脚本,所以页面文件名常以a ...
- leetcode140 Word Break II
思路: 直接爆搜会超时,需要使用记忆化搜索.使用map把已经计算过的情况记录下来,避免重复计算. 实现: class Solution { public: vector<string> w ...
- mysql查询问题
需求:根据选择不同的分类id,查找到同时属于选中的分类的文章id sql语句: select result,GROUP_CONCAT(category_id) from (select categor ...
- Sublime的用法
一.首先安装插件 1.安装Package Control,这是为了安装其他插件做基础,它可以方便我们下载其他插件 (1).按Ctrl+`调出console(注:避免热键冲突) (2).粘贴以下代码到命 ...
- 精通AngularJS(三)深入scope,继承结构,事件系统和生命周期
深入探讨 Scope 作用域 每一个 $scope 都是类 Scope 的一个实例.类 Scope 拥有可以控制 scope 生命周期的方法,提供事件传播的能力,并支持模板渲染. 作用域的层次结构 让 ...
- android布局不带参数返回
package com.example.lesson3_4; import java.util.ArrayList; import java.util.List; import android.app ...
- uvm_misc——杂货铺(miscellaneous)
uvm_misc 是个很有意思的文件夹,本质上就是个UVM的杂货铺,包含一些很重要的class, task, function, 但不知道给归类到哪儿,所以,uvm_misc就很好地承担了这个任务,几 ...
- HTTP 三次握手 建立连接 和 四次握手断开连接
三次握手建立连接 第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机: 第二次握手:主机B收到请求后要确 ...