1.进程的其他方法:
首先引入模块:
import os
from multiprocessing import Process
p = Process(target=f,)
进程的id:  p.pid 或者os.getpid 或者os.getppid
进程的名字:  p.name
查看进程是否活着: p.is_alive #返回一个ture或者false
p.terminate   给操作系统发送一个结束进程的信号
import time
import os
from multiprocessing import Process
 
# def f1():
#     print('子进程的pid',os.getpid())
#     print('子进程的父进程的pid',os.getppid())
#     print('aaa')
#
# def f2():
#     print('bbb')
#
#
# if __name__ == '__main__':
#
#     p1 = Process(target=f1,name='宝宝1')
#     p2 = Process(target=f2,)
#     p1.start()
#     p2.start()
#     print(p1.name)
#     print('子进程的pid',p1.pid)
#     print('父进程的id',os.getpid())
 
#进程的其他方法
def f1():
    time.sleep(5)
    print('子进程1号')
 
if __name__ == '__main__':
    p = Process(target=f1,)
    p.start()
 
    print(p.is_alive())  #判断子进程是否还活着,是否还在运行
    p.terminate() #给操作系统发送一个结束进程的信号
    time.sleep(0.5)
    print(p.is_alive())
 
2.验证进程之间是空间隔离的: 局部引入全局变量,在局部进行变量的重新赋值,查看全局变量是否被更改,如果没有更改,证明进程之间是空间隔离的,否则进程不是空间隔离的.
from multiprocessing import Process
 
num = 100
def f1():
    global num
    num= 3
    print('子进程中的num',num)
 
print(">>>>>>>",num)
if __name__ == '__main__':
    p=Process(target=f1,)
    p.start()
    p.join()  ##等到子进程结束之后,主进程才能关闭
    print('主进程中的num',num)
 
# >>>>>>> 100
# >>>>>>> 100
# 子进程中的num 3
# 主进程中的num 100
3.守护进程
p.deamon = True 守护进程,必须写在start之前,主进程的代码运行完成,设置为守护进程的子进程会随之结束
import time
from multiprocessing import Process
 
def f1():
    time.sleep(3)
    print('xxx')
 
def f2():
    time.sleep(5)
    print('普通子进程的代码')
 
if __name__ == '__main__':
    p = Process(target=f1,)
    p.daemon =True  #将该进程设置为守护进程,必须写在start之前,意思是如果我的主进程代码运行结束了,你这子进程不管运行到什么地方,都直接结束
    p.start()
    #开启一个不同的子进程来验证一下守护进程的结束只和主进程的代码运行结束有关系,而整个程序的结束需要主进程的子进程的代码都运行结束才结束
    p2 = Process(target=f2,)
    p2.start()
    #等待2号普通进程的结束,才继续执行写面主进程中的代码
    # p2.join()
    #守护进程会跟随父进程的代码结束,就结束
    print('主进程结束')
4.进程锁(同步锁/互斥锁)
锁:保证数据的安全,但是牺牲了效率,枷锁的这段代码变成了(同步)串行执行的状态,又叫同步锁/互斥锁(重点)
a.第一种写法
loc =Lock()
loc.acquire()
需要锁的代码
loc.release()
b.第二种写法
with loc:
      需要锁的代码
 
# 互斥锁/进程锁/同步锁
# import json
import time
from multiprocessing import Process,Lock
 
def show_t(i):
 
    with open('ticket','r',encoding='utf-8') as f:
        ticket_data = f.read()
    # print(ticket_data)
    t_data = eval(ticket_data)
    # print(t_data,type(t_data))
    print('%s查询剩余票数为%s'%(i,t_data['count']))
 
def get_t(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)
    # print(t_data,type(t_data))
    # print('%s查询剩余票数为%s' % (i, t_data['count']))
    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_t,args=(i,))
        p1.start()
    for i in range(10):
        p2 = Process(target=get_t,args=(i,l1) )
        p2.start()
5.数据的共享
  Manager() 数据共享,也需要在导入进程模块使用
import time
from multiprocessing import Process,Manager,Lock
def f1(m_d,l2):
    # m_d['num'] -= 1  #
    with l2:
        # l2.acquire()
        tmp = m_d['num']
        tmp -= 1
        time.sleep(0.1)
        m_d['num'] = tmp
        # l2.release()
 
if __name__ == '__main__':
    m = Manager()
    l2 = Lock()
    m_d = m.dict({'num':100})
    p_list = []
    for i in range(10):
        p = Process(target=f1,args=(m_d,l2))
        p.start()
        p_list.append(p)
 
    [pp.join() for pp in p_list]
 
    print(m_d['num'])
6队列(重点)   Queue()
q = Queue(10)
q.put() 放数据
q.get() 取数据
q.qsize() 返回的是当前队列中内容的长度
q.put_nowait() 不等待,但是报错
q.get_nowait() 不等待,但是报错
q.full()   因为这个东西不可靠,满了返回一个True,不满返回一个False
q.empty()  因为这个东西不可靠,空了返回一个True,不空返
from multiprocessing import Process,Queue
q = Queue(3)  #创建一个队列对象,队列长度为3,先进先出
q.put(1)
# print('>>>>>',q.qsize()) #返回当前队列的内容长度
print(q.full())
q.put(2)
# print('>>>>>',q.qsize())
q.put(3)
print(q.full())  #q.full()了解,因为这个东西不可靠,满了返回一个True,不满返回一个False
# print('sss')
# q.put(4)  #放入数据的时候,如果队列满了了,程序会在你put操作的地方阻塞
# try:
#     q.put_nowait(4) #不阻塞程序,但是会报错queue.Full,可以通过捕获异常来进行其他的操作
# except:
#     print('队列满了,玩别的去吧')
# print('xxx')
print(q.get())
print(q.get())
print(q.get())
print('是不是空了呀:',q.empty()) #q.empty()了解,因为这个东西不可靠,空了返回一个True,不空返
# q.put(4)
# print('是不是空了呀:',q.empty())  #True或者False,因为q在put数据的时候,有一个细微的延迟
# 回一个False
# print(q.get())  #如果队列空了,程序会在这个地方卡主,也就是阻塞程序
try:
    q.get_nowait()  #queue.Empty
except:
    print('队列空了,搞得别的事情')
print('拿多啦')
7.JoinableQueue
task_done()  给队列返回一个任务处理完毕的信号
join()  等待放入队列的人物全部执行完毕,也就是等待task_done()的信号数量等于放入队列中的所有任务的数量,不然会阻塞
 
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() #就等着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 = Queue(30)
    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()
 
 
    pro_p.join()
    print('主进程结束')
 
 
 
 
 
 
 
1.进程的其他方法:
首先引入模块:
import os
from multiprocessing import Process
p = Process(target=f,)
进程的id:  p.pid 或者os.getpid 或者os.getppid
进程的名字:  p.name
查看进程是否活着: p.is_alive #返回一个ture或者false
p.terminate   给操作系统发送一个结束进程的信号
import time
import os
from multiprocessing import Process
 
# def f1():
#     print('子进程的pid',os.getpid())
#     print('子进程的父进程的pid',os.getppid())
#     print('aaa')
#
# def f2():
#     print('bbb')
#
#
# if __name__ == '__main__':
#
#     p1 = Process(target=f1,name='宝宝1')
#     p2 = Process(target=f2,)
#     p1.start()
#     p2.start()
#     print(p1.name)
#     print('子进程的pid',p1.pid)
#     print('父进程的id',os.getpid())
 
#进程的其他方法
def f1():
    time.sleep(5)
    print('子进程1号')
 
if __name__ == '__main__':
    p = Process(target=f1,)
    p.start()
 
    print(p.is_alive())  #判断子进程是否还活着,是否还在运行
    p.terminate() #给操作系统发送一个结束进程的信号
    time.sleep(0.5)
    print(p.is_alive())
 
2.验证进程之间是空间隔离的: 局部引入全局变量,在局部进行变量的重新赋值,查看全局变量是否被更改,如果没有更改,证明进程之间是空间隔离的,否则进程不是空间隔离的.
from multiprocessing import Process
 
num = 100
def f1():
    global num
    num= 3
    print('子进程中的num',num)
 
print(">>>>>>>",num)
if __name__ == '__main__':
    p=Process(target=f1,)
    p.start()
    p.join()  ##等到子进程结束之后,主进程才能关闭
    print('主进程中的num',num)
 
# >>>>>>> 100
# >>>>>>> 100
# 子进程中的num 3
# 主进程中的num 100
3.守护进程
p.deamon = True 守护进程,必须写在start之前,主进程的代码运行完成,设置为守护进程的子进程会随之结束
import time
from multiprocessing import Process
 
def f1():
    time.sleep(3)
    print('xxx')
 
def f2():
    time.sleep(5)
    print('普通子进程的代码')
 
if __name__ == '__main__':
    p = Process(target=f1,)
    p.daemon =True  #将该进程设置为守护进程,必须写在start之前,意思是如果我的主进程代码运行结束了,你这子进程不管运行到什么地方,都直接结束
    p.start()
    #开启一个不同的子进程来验证一下守护进程的结束只和主进程的代码运行结束有关系,而整个程序的结束需要主进程的子进程的代码都运行结束才结束
    p2 = Process(target=f2,)
    p2.start()
    #等待2号普通进程的结束,才继续执行写面主进程中的代码
    # p2.join()
    #守护进程会跟随父进程的代码结束,就结束
    print('主进程结束')
4.进程锁(同步锁/互斥锁)
锁:保证数据的安全,但是牺牲了效率,枷锁的这段代码变成了(同步)串行执行的状态,又叫同步锁/互斥锁(重点)
a.第一种写法
loc =Lock()
loc.acquire()
需要锁的代码
loc.release()
b.第二种写法
with loc:
      需要锁的代码
 
# 互斥锁/进程锁/同步锁
# import json
import time
from multiprocessing import Process,Lock
 
def show_t(i):
 
    with open('ticket','r',encoding='utf-8') as f:
        ticket_data = f.read()
    # print(ticket_data)
    t_data = eval(ticket_data)
    # print(t_data,type(t_data))
    print('%s查询剩余票数为%s'%(i,t_data['count']))
 
def get_t(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)
    # print(t_data,type(t_data))
    # print('%s查询剩余票数为%s' % (i, t_data['count']))
    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_t,args=(i,))
        p1.start()
    for i in range(10):
        p2 = Process(target=get_t,args=(i,l1) )
        p2.start()
5.数据的共享
  Manager() 数据共享,也需要在导入进程模块使用
import time
from multiprocessing import Process,Manager,Lock
def f1(m_d,l2):
    # m_d['num'] -= 1  #
    with l2:
        # l2.acquire()
        tmp = m_d['num']
        tmp -= 1
        time.sleep(0.1)
        m_d['num'] = tmp
        # l2.release()
 
if __name__ == '__main__':
    m = Manager()
    l2 = Lock()
    m_d = m.dict({'num':100})
    p_list = []
    for i in range(10):
        p = Process(target=f1,args=(m_d,l2))
        p.start()
        p_list.append(p)
 
    [pp.join() for pp in p_list]
 
    print(m_d['num'])
6队列(重点)   Queue()
q = Queue(10)
q.put() 放数据
q.get() 取数据
q.qsize() 返回的是当前队列中内容的长度
q.put_nowait() 不等待,但是报错
q.get_nowait() 不等待,但是报错
q.full()   因为这个东西不可靠,满了返回一个True,不满返回一个False
q.empty()  因为这个东西不可靠,空了返回一个True,不空返
from multiprocessing import Process,Queue
q = Queue(3)  #创建一个队列对象,队列长度为3,先进先出
q.put(1)
# print('>>>>>',q.qsize()) #返回当前队列的内容长度
print(q.full())
q.put(2)
# print('>>>>>',q.qsize())
q.put(3)
print(q.full())  #q.full()了解,因为这个东西不可靠,满了返回一个True,不满返回一个False
# print('sss')
# q.put(4)  #放入数据的时候,如果队列满了了,程序会在你put操作的地方阻塞
# try:
#     q.put_nowait(4) #不阻塞程序,但是会报错queue.Full,可以通过捕获异常来进行其他的操作
# except:
#     print('队列满了,玩别的去吧')
# print('xxx')
print(q.get())
print(q.get())
print(q.get())
print('是不是空了呀:',q.empty()) #q.empty()了解,因为这个东西不可靠,空了返回一个True,不空返
# q.put(4)
# print('是不是空了呀:',q.empty())  #True或者False,因为q在put数据的时候,有一个细微的延迟
# 回一个False
# print(q.get())  #如果队列空了,程序会在这个地方卡主,也就是阻塞程序
try:
    q.get_nowait()  #queue.Empty
except:
    print('队列空了,搞得别的事情')
print('拿多啦')
7.JoinableQueue
task_done()  给队列返回一个任务处理完毕的信号
join()  等待放入队列的人物全部执行完毕,也就是等待task_done()的信号数量等于放入队列中的所有任务的数量,不然会阻塞
 
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() #就等着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 = Queue(30)
    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()
 
 
    pro_p.join()
    print('主进程结束')
 
 
 
 
 
 
 

day31 进程和其他方法,锁,队列的更多相关文章

  1. Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型

    Python进阶----进程之间通信(互斥锁,队列(参数:timeout和block),), ***生产消费者模型 一丶互斥锁 含义: ​ ​ ​ 每个对象都对应于一个可称为" 互斥锁&qu ...

  2. day 31 进程的其他方法 进程锁 进程队列

    一.进程的其他方法 1.   .name      进程名   (可指定) 2.  .pid     进程号 3.   os.getpid         在什么位置就是什么的进程号 4.   .is ...

  3. python网络编程--进程(方法和通信),锁, 队列,生产者消费者模型

    1.进程 正在进行的一个过程或者说一个任务.负责执行任务的是cpu 进程(Process: 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在 ...

  4. 进程锁,队列,JoinableQueue

    内容梗概: 1.进程同步(锁) 2.队列(重点) 3.生产者消费者模式 4.JoinableQueue([maxsize]) 5.信号量(了解) 6.事件 1.进程同步(锁) 并发编程让我们能更加充分 ...

  5. day31 锁 队列 前面课程重点总结

    今日内容: 1.进程的其他方法 2.僵尸进程和孤儿进程(了解) 3.验证进程之间是空间隔离的 4.守护进程 5.进程锁 重点(又叫同步锁,互斥锁) 6.进程队列(重点)  Queue 7.生产者消费者 ...

  6. day 28 :进程相关,进程池,锁,队列,生产者消费者模式

    ---恢复内容开始--- 前情提要: 一:进程Process  1:模块介绍 from multiprocessing import Process from multiprocessing impo ...

  7. Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量

    Python进阶----线程基础,开启线程的方式(类和函数),线程VS进程,线程的方法,守护线程,详解互斥锁,递归锁,信号量 一丶线程的理论知识 什么是线程:    1.线程是一堆指令,是操作系统调度 ...

  8. 进程(守护进程--互斥锁--IPC机制--生产者模型--僵尸进程与孤儿进程--模拟抢票--消息队列)

    目录 一:进程理论知识 1.理论知识 二:什么是进程? 三:僵尸进程与孤儿进程 1.僵尸进程 四:守护进程 1.什么是守护进程? 2.主进程创建守护进程 3.守护进程 五:互斥锁(模拟多人抢票) 1. ...

  9. 创建进程,join方法,进程对象相关属性和方法,僵尸进程和孤儿进程,守护进程,互斥锁

    创建进程 在python中提供了一个multiprocessing模块可以帮助我们使用多进程解决问题.在multiprocessing 模块中有一个类Process. from multiproces ...

随机推荐

  1. apache2 tomat https 变成http的解决方案

    1.apache2   设置 RequestHeader set X-Forwarded-Proto "https" 2.springboot 设置 server.tomcat.p ...

  2. 颜色矩原理及Python实现

    原理 颜色矩(color moments)是由Stricker 和Orengo所提出的一种非常简单而有效的颜色特征.这种方法的数学基础在于图像中任何的颜色分布均可以用它的矩来表示.此外,由于颜色分布信 ...

  3. scp 上传和下载文件

    mac和linux自带scp命令,windows的话请考虑gitbash或者专业linux工具 (默认端口为22,所以-p可不写) 上传文件 scp -p /home/lnmp.gz root@ip: ...

  4. Oracle案例05——ORA-12162: TNS:net service name is incorrectly specified

    最近在梳理环境,发现环境真的不是一般的复杂,配置不是一般的乱,刚在梳理环境的时候发现一个库通过conn /as sysdba无法连接,具体处理过程如下: 一.错误信息 [oracle@ ~]$ sql ...

  5. js中直接调用函数和new函数的区别

    如果函数返回值为常规意义上的值类型(Number.String.Boolean)时,new函数将会返回一个该函数的实例对象,而如果函数返回一个引用类型(Object.Array.Function),则 ...

  6. photoshopcs6破解补丁用来干嘛的

    photoshopcs6破解补丁为 Adobe CS6 系列软件通用破解补丁,亲测可用,终于能用了不再出现那个烦人的购买页面了,cs6破解补丁解压后得到32和64两个文件夹,根据自己的系统类型选择,6 ...

  7. 关于 Windows 7 语言包

    在对IE浏览器进行多语言对应的时候,网页会检测当前系统的语言,来判断网页需要以哪种语言显示.但是,在给系统安装指定语言包时,可能会遇到安装失败的情况,原因就是需要在你的电脑上安装必需的基本语言包.请看 ...

  8. Maven高级应用--编译全模块包-dist包

    1. 在需要生成dist包的模块级别,新建文件夹xxx-xxxx-dist 2. 进入目录,新建pom.xml,建议copy 3. dependencies节点,把要编译成全局包的应用引入进来 < ...

  9. Java虚拟机3:内存溢出

    1.前言 上一篇我们介绍了java的内存区域结构,这一篇,模拟内存溢出的几个场景,下面一个图是总体的指导思想: 2.Java堆溢出 Java堆唯一的作用就是存储对象实例,只要保证不断创建对象并且对象不 ...

  10. 转:Json序列化和反序列化

    JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍 ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介 ...