一. 进程的其他方法

  进程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. JMeter BeanShell示例

    翻译:https://blog.trigent.com/jmeter-blog-series-jmeter-beanshell-example 在这个例子中,我们将演示在Apache JMeter中使 ...

  2. 洛谷 P1086 花生采摘

    P1086 花生采摘 将植株按花生数从大到小排序,然后按排序后的顺序摘,每次摘前计算能否在摘后回到路边,如果能就将ans加上该植株花生数,如果不能就直接输出当前ans并退出. var a:array[ ...

  3. DDX_Text详细用法

    void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, BYTE& value ); void AFXAPI DDX_Text( CDataEx ...

  4. Eureca Server的Helloworld例子

    [学习笔记] 1.Eureca Server的Helloworld例子: 做个普通的maven project,quickstart archetype.改成jdk.8.下面Camden.SR1是版本 ...

  5. Mysql常用的优化技巧

    1.通过show status 命令了解各种sql的执行效率 2. 定位执行效率较低的SQL语句 开启慢查询记录: 打开Mysql配置文件my.ini ,找到 [mysqld] 在其下面添加 long ...

  6. 起学习iOS开发专用词汇

    今天的单词分别是: l   Asynchronous  形容词 异步的 n  副词形式: asynchronously 异步地 n  缩写:ASYNC n  反义词:synchronous 形容词同步 ...

  7. 快速排序的一种Java实现

    快速排序是笔试和面试中很常见的一个考点.快速排序是冒泡排序的升级版,时间复杂度比冒泡排序要小得多.除此之外,快速排序是不稳定的,冒泡排序是稳定的. 1.原理 (1)在数据集之中,选择一个元素作为&qu ...

  8. sqlite总结1

    I Shell下命令行程序CLP I .help II 命令的简写 .e = .quit .s .h = .help II 数据库管理 A 创建数据库 1 CREATE TABLE id_name(i ...

  9. Eclipse下对MAVEN进行junit软件测试

    一.Maven project management and build automation tool, more and more developers use it to manage the ...

  10. Clown without borders 2017/1/9

    原文 Taking laughter to those who need it most "When will you all return again?"the Croatian ...