一. 进程的其他方法

  进程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--进程内容补充的更多相关文章

  1. python之路--进程内容补充

    一. 进程的其他方法 进程id, 进程名字, 查看进程是否活着(is_alive()), terminate()发送结束进程的信号 import time import os from multipr ...

  2. python2.0 s12 day8 _ python线程&python进程

    1.进程.与线程区别2.cpu运行原理3.python GIL全局解释器锁4.线程 1.语法 2.join 3.线程锁之Lock\Rlock\信号量 4.将线程变为守护进程 5.Event事件 6.q ...

  3. python 全栈开发,Day93(vue内容补充,VueX)

    昨日内容回顾 1. 页面的布局 Vue中使用Bootstrap搭页面 1. 安装 1. npm install bootstrap@3.3.7 -S 2. 使用 1. import 'bootstra ...

  4. 初步理解Python进程的信号通讯

    Reference: http://www.jb51.net/article/63787.htm 信号的概念 信号(signal)--     进程之间通讯的方式,是一种软件中断.一个进程一旦接收到信 ...

  5. python——进程基础

    我们现在都知道python的多线程是个坑了,那么多进程在这个时候就变得很必要了.多进程实现了多CPU的利用,效率简直棒棒哒~~~ 拥有一个多进程程序: #!/usr/bin/env python #- ...

  6. 使用gdb调试Python进程

    使用gdb调试Python进程 有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump.例如现在遇到一个mod_wsgi的进程僵死了,不接受请求,想看看究竟是运行到 ...

  7. python/数据库操作补充—模板—Session

    python/数据库操作补充—模板—Session 一.创建一个app目录 在models.py只能类进行进行创建表 class Foo: xx= 字段(数据库数据类型) 字段类型 字符串 Email ...

  8. python进程、进程池(二)代码部分

    第一种创建进程的方式: from multiprocessing import Process def f(name): print(name,"在子进程") if __name_ ...

  9. Python 进程之间共享数据

    最近遇到多进程共享数据的问题,到网上查了有几篇博客写的蛮好的,记录下来方便以后查看. 一.Python multiprocessing 跨进程对象共享  在mp库当中,跨进程对象共享有三种方式,第一种 ...

  10. python 进程和线程(代码知识部分)

    二.代码知识部分 一 multiprocessing模块介绍: python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情 ...

随机推荐

  1. java的无序机制

    简单说一下上面提到的无序写,这是jvm的特性,比如声明两个变量,String a; String b; jvm可能先加载a也可能先加载b.同理,instance = new Singleton();可 ...

  2. python操作json来存储简单的数据,pickle来操作复杂的数据

    json作为不同语言间进行数据交互的媒介,在当下已经渐渐取代了之前的xml,看一波python操作json # coding = ascii import json import pickle imp ...

  3. 洛谷 P2623 物品选取

    https://www.luogu.org/problemnew/show/P2623 https://www.luogu.org/blog/test-1/solution-p2623 重点就是甲类物 ...

  4. C# (Cookie)基本操作

    在Common中新建一个CookieHelper,全局调用 using System; using System.Collections.Generic; using System.Linq; usi ...

  5. SourceGrid之Grid绑定数据

    private void BindData() { //为绑定的按钮选线增加单击事件 SourceGrid.Cells.Controllers.CustomEvents clickEvent = ne ...

  6. 安装drupal对服务器环境的要求

    Drupal 8 Apache 2.x PHP 5.5.9 及以上版本 MySQL 5.5.3 及以上版本 Drupal 7 Apache 2.x PHP 5.2.5 及以上版本(推荐 PHP 5.4 ...

  7. Android Theme.Dialog 到光 AppCompatDialog

    我用在我的 style.xml 作为主要应用程序主题 <style name="AppTheme" parent="Theme.AppCompat.Light&qu ...

  8. Genymotion的安装与设置

    Genymotion是一款非常好用的虚拟机,利用它可以在window.Liunx或MAC系统上实现Android的模似器.对于开发人员来说,有了Android模似器,就可以在电脑上实时调试安卓app, ...

  9. ubuntu 14.04 安装redis

    root@hett-PowerEdge-T30:~# sudo apt-get install redis-server Reading package lists... DoneBuilding d ...

  10. Kubernetes里的ConfigMap的用途

    顾名思义,ConfigMap用于保存配置数据的键值对,可以用来保存单个属性,也可以用来保存配置文件. ConfigMap同Kubernetes的另一个概念secret类似,区别是ConfigMap主要 ...