一. 进程的其他方法

  进程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. Qt 进程和线程之三:线程同步、可重入与线程安全

    一.同步线程方法 使用线程的目的是允许代码并行运行,但是有时线程必须停止并等待其他线程.例如,如果两个线程试图同时写入相同的变量,结果是不确定的,所以需要同步线程.同步线程是一种保护共享资源等数据的常 ...

  2. Qt 进程和线程之二:启动线程

    Qt提供了对线程的支持,这包括一组与平台无关的线程类.一个线程安全的发送事件的方式,以及跨线程的信号槽的关联.这些使得可以很容易地开发可移植的多线程Qt应用程序,可以充分利用多处理器的机器.多线程编程 ...

  3. Elasticsearch之入门知识

    elasticsearch是一个高度可扩展得开源全文搜索和分析的引擎.可以快速.近实时的存储,搜索和分析大量数据.通常用作底层引擎技术,为具有复杂搜索功能和要求的程序提供支持. 用处: • 运行网上商 ...

  4. 部署iis服务器与c#程序遇到的问题小结

    记得上次部署IIS服务器比较顺利,半天搞定的?有点忘了. 但,服务器版本各有不同,这次装的是server2008 R2 Ennterprice版.虽然忘了上次装的是哪个版本,但进去后发现有些东西明显不 ...

  5. 字符串与C51的格式化输出

    一字符数组和字符指针: 字符指针可以用字符串对其直接初始化和随时赋值:而字符数组可以用字符串进行初始化,但不能用字符串对其进行随时赋值(但此时可以定义一个字符串指针指向字符数组,然后用字符串对指针随时 ...

  6. js中对象与函数的关系

    首先什么是对象?根据W3C上面的解释JS中所有事物都是对象,对象是拥有属性和方法的数据,由此可以看出基本值类型不是对象(number.string.Boolean.Undefined),剩下的引用类型 ...

  7. .NET Core 1.0 CentOS7 尝试(一、安装)

    昨天宣布 ASP.NET Core RC2,据说差不多稳定了,以后不会有大改了. 参考:https://blogs.msdn.microsoft.com/webdev/2016/05/16/annou ...

  8. ajax传给springMVC数据编码集问题

    前台 ajax: $.ajax("${pageContext.request.contextPath}/hello",// 发送请求的URL字符串. { dataType : &q ...

  9. hdu 3555 Bomb 炸弹(数位DP,入门)

    题意: 给一个数字n,求从1~n中有多少个数是含有49的,比如49,149,1490等都是含49的. 思路: 2^64也顶多是十进制的20多位,那么按十进制位来分析更简单.如果能计算k位十进制数中分别 ...

  10. 记录我开发工作中遇到HTTP跨域和OPTION请求的一个坑

    我通过这篇文章把今天工作中遇到的HTTP跨域和OPTION请求的一个坑记录下来. 场景是我需要在部署在域名a的Web应用里用JavaScript去消费一个部署在域名b的服务器上的服务.域名b上的服务也 ...