zoukankan      html  css  js  c++  java
  • 进程的其他方法:

      pid:查看进程号

      name:查看进程名

      is_alive():产看进程是否还活着

      terminate():给操作系统发送一个结束进程的信号  

    守护进程:

      P.daemon = true

      设置为守护进程,主进程代码运行完毕被设置为守护的子进程会随之结束

    孤儿进程、僵尸进程(了解)

    锁:保证数据安全,牺牲了效率:加锁的这段代码使进程变成了串行执行状态;多进程同时使用数据,会导致数据不安全

    l= Lock()

    一。with l:

        pass

    二。  

      l.acquire()

      pass

      l.release()

    队列:

      Queue()

      q=Queue(10)

      q.put() 放数据

      q.get() 取数据

      q.size()返回当前队列长度

    消费者生产者模型:缓冲用,解耦用,防止通行的一方卡住

    示例一:缺点多个结束信号不科学

     1 from multiprocessing import Process,Queue
     2 import time
     3 
     4 def produce(q):
     5     for i in range(10):
     6         time.sleep(0.2)
     7         s = '%s号包子'%i
     8         q.put(s)
     9         print(s+'中了')
    10     q.put(None)
    11 
    12 def consumer(q):
    13     while 1:
    14         time.sleep(0.5)
    15         num = q.get()
    16         if num == None:
    17             print('吃完了,海量啊')
    18             break
    19         print('%s被吃了'%num)
    20 
    21 if __name__ == '__main__':
    22     q = Queue(10)
    23     pro = Process(target=produce,args=(q,))
    24     con = Process(target=consumer,args=(q,))
    25 
    26     pro.start()
    27     con.start()
    28 
    29 # 模拟了一个生产者与一个消费者的过程,可以自动结束
    30 # 但是通过发结束信号来终止的方式在面对多个消费者时不方便。

    示例2:改进,使用Joinablequeue

    q.task_done()  #给队伍返回一个任务处理完毕的信号
    q.join()  #等待放入队列中的任务全部执行完毕,即上面的数量等于放入队列中的所有数量,在此之前,阻塞
     1 from multiprocessing import Process,Queue,JoinableQueue
     2 import time
     3 
     4 def produce(q):
     5     for i in range(10):
     6         time.sleep(0.2)
     7         s = '%s号包子'%i
     8         q.put(s)
     9         print(s+'中了')
    10     q.join()
    11 
    12 def consumer(q):
    13     while 1:
    14         time.sleep(0.5)
    15         num = q.get()
    16         print('%s被吃了'%num)
    17         q.task_done()
    18 
    19 if __name__ == '__main__':
    20     q = JoinableQueue(10)
    21     pro = Process(target=produce,args=(q,))
    22     con = Process(target=consumer,args=(q,))
    23 
    24     pro.start()
    25     con.daemon = True   #设置为守护进程,以便在主程序结束的时候可以结束这个while循环的子进程
    26     con.start()
    27 
    28     pro.join()          #等到生产者运行结束,生产者结束的标志是被取走的任务与放入的相同,即此时队列为空
    29     print('主程序运行结束')
    30 
    31 #即使多个消费者,此时也不需要再重复发送结束信号。此时需要明确两个join的不同作用以及准确的守护进程设置
    32 # consumer()是一个while循环,不会结束。 produce()运行结束时队列为空,程序功能实现,
    33 # 因此必须等consumer()执行结束,才可以结束主程序,避免守护进程被提钱杀死。

    进程数据共享

     1 from multiprocessing import Process,Manager,Lock
     2 import time
     3 def f1(m_d):
     4     temp = m_d['num']
     5     temp -= 1
     6     m_d['num'] = temp
     7 
     8 if __name__ == '__main__':
     9     m = Manager()
    10     m_d = m.dict({'num':100})
    11     p_list = []
    12     for i in range(10):
    13         p = Process(target=f1,args=(m_d,))
    14         p.start()
    15         p_list.append(p)
    16     for p in p_list:
    17         p.join()
    18 
    19     print(m_d['num'])
    20 
    21 
    22 #此时,数据通信正常,但是如果操作需要时间,就会导致出问题,后面进程拿到的数据可能是之前没有处理完的。
    23 #为解决之,加锁
    24 def f1(m_d,lic):
    25     lic.acquire()
    26     temp = m_d['num']
    27     temp -= 1
    28     time.sleep(1)
    29     m_d['num'] = temp
    30     lic.release()
    31 if __name__ == '__main__':
    32     m = Manager()
    33     m_d = m.dict({'num':100})
    34     p_list = []
    35     lic = Lock()
    36     for i in range(10):
    37         p = Process(target=f1,args=(m_d,lic))
    38         p.start()
    39         p_list.append(p)
    40     for p in p_list:
    41         p.join()
    42 
    43     print(m_d['num'])
    44 
    45 #加锁之后,保证不论时间多久,前一个子进程在释放锁之后,后面的子进程才会执行锁内的代码,降低了效率

    锁的应用之抢票模型

     1 from multiprocessing import Process,Lock
     2 import time
     3 def search_ticket(i):
     4     with open('ticket','r',encoding='utf-8') as f:
     5         num_txt =  f.read()
     6         num_dict = eval(num_txt)
     7         return num_dict
     8 
     9 def show_ticket(i):
    10     print('%s号查询到的剩余票数为%s'%(i,search_ticket(i)['ticket']))
    11 
    12 def get_ticket(i,lic):
    13     lic.acquire()
    14     num_ticket = search_ticket(i)
    15     if num_ticket['ticket'] > 0:
    16         print('%s号抢到了'%i)
    17         num_ticket['ticket'] -= 1
    18         with open('ticket', 'w', encoding='utf-8') as f:
    19             f.write(str(num_ticket))
    20     else:
    21         print('%s号没抢到'%i)
    22     lic.release()
    23 
    24 if __name__ == '__main__':
    25     for i in range(1,11):
    26         p1 = Process(target=show_ticket,args=(i,))
    27         p1.start()
    28     lic = Lock()
    29     for i in range(1,11):
    30         p2 = Process(target=get_ticket,args=(i,lic))
    31         p2.start()
    32 
    33 #锁的作用是锁定结束前抢到的人执行至锁释放,然后其余人也竞争,每一轮都相同
  • 相关阅读:
    第四次实验报告
    第三次实验报告
    第五章 循环结构课后反思
    第二次实验报告
    第一次实验报告
    第一次作业
    第九章实验报告(构造数据类型)
    第八章实验报告(指针实验)
    第七章实验报告(数组实验)
    第六章 函数和宏定义实验(2)
  • 原文地址:https://www.cnblogs.com/shachengcc1/p/11333357.html
Copyright © 2011-2022 走看看