zoukankan      html  css  js  c++  java
  • 网络编程之进程2

    寄存器:运行时间快,但是容量比较小

    一 守护进程

     1 什么是守护进程:

      守护进程就是辅助主进程的代码的执行,守护进程会伴随着主进程的代码的运行周期的。主进程的代码执行完毕之后,守护进程就没有存在的必要,所以守护进程会在主进程代码执行完毕之后自动终止。

      守护进程中是无法在开启其他的子进程,否则就会抛出异常。

     2 创建一个守护进程:

      daemon=True:创建守护进程,daemon默认等于False。

     实例1:

    # import multiprocessing
    # import time
    # def walk(n):
    #     print('>>>>>>start',n)
    #     time.sleep(3)
    #     print('>>>>>>end',n)
    # if __name__=='__main__':
    #     p1=multiprocessing.Process(target=walk,args=(2,))
    #     p2=multiprocessing.Process(target=walk,args=(4,))
    #     p1.daemon=True
    #     p1.start()
    #     p2.start()
    #     print('执行完毕')
     

    实例2:

    # import multiprocessing
    # import time
    # def walk(n):
    #     print('>>>>>>start',n)
    #     time.sleep(3)
    #     print('>>>>>>end',n)
    # if __name__=='__main__':
    #     p1=multiprocessing.Process(target=walk,args=(2,))
    #     p2=multiprocessing.Process(target=walk,args=(4,))
    #     p1.daemon=True
    #     p1.start()
    #     p2.start()
    #     time.sleep(2)
    #     print('执行完毕')
    

    实例3 :

    # import multiprocessing
    # import time
    # def walk(n):
    #     print('>>>>>>start',n)
    #     time.sleep(3)
    #     print('>>>>>>end',n)
    # if __name__=='__main__':
    #     p1=multiprocessing.Process(target=walk,args=(2,))
    #     p2=multiprocessing.Process(target=walk,args=(4,))
    #     p1.daemon=True
    #     p1.start()
    #     p2.start()
    #     print('执行完毕')
    #     time.sleep(0.1)
    

     注意:进程和进程之间是相互独立的,只要主进程中的代码没有执行完,守护进程中的代码还是会被执行的。

    二 同步锁也叫互斥锁

     同步锁的作用是:把并发变成串行,将竞争变得有序化

      Lock:锁

      acquire:加上锁

      release:解锁

    如下:

    import multiprocessing
    import json
    import random
    import time
    json.dump({'count':10},open('a.txt','w'))
    time.sleep(1)
    def wolk(n):
        ret=json.load(open('a.txt'))
        print('<%s>  查看还剩%s张票'%(n,ret['count']))
    def foo(n):
        ret=json.load(open('a.txt'))
        if ret['count']>0:
            x=random.randint(1,5)
            if x>ret['count']:
                x = ret['count']
            ret['count'] -= x
            time.sleep(0.2)
            json.dump(ret, open('a.txt', 'w'))
            print('%s 购买了%s张票' % (n, x))
    
    def wolk_foo(n,lock):
        wolk(n)
        lock.acquire()
        foo(n)
        lock.release()
    if __name__=='__main__':
        lock=multiprocessing.Lock()
        for j in range(20):
                p=multiprocessing.Process(target=wolk_foo,args=(j,lock))
                p.start()
    

      with 锁:自动加上锁,执行完毕过后自动解开锁。  如下:

    # import multiprocessing
    # import json
    # import random
    # import time
    # json.dump({'count':10},open('a.txt','w'))
    # time.sleep(1)
    # def wolk(n):
    #     ret=json.load(open('a.txt'))
    #     print('<%s>  查看还剩%s张票'%(n,ret['count']))
    # def foo(n):
    #     ret=json.load(open('a.txt'))
    #     if ret['count']>0:
    #         x=random.randint(1,5)
    #         if x>ret['count']:
    #             x = ret['count']
    #         ret['count'] -= x
    #         time.sleep(0.2)
    #         json.dump(ret, open('a.txt', 'w'))
    #         print('%s 购买了%s张票' % (n, x))
    #
    # def wolk_foo(n,lock):
    #     wolk(n)
    #     with lock:
    #         foo(n)
    # if __name__=='__main__':
    #     lock=multiprocessing.Lock()
    #     for j in range(20):
    #             p=multiprocessing.Process(target=wolk_foo,args=(j,lock))
    #             p.start()
    

     加上锁是为了实现串行,保证代码的安全性,但是减低了代码的执行效率

      注意:在 这两个实例中,最开始dump文件的时候是需要一段时间的(也就是I/O阻塞),所以在dump文件的后睡上一段时间,假如不加上睡眠时间,文件数据就会错乱或者报错。

    三 IPC机制

     IPC机制就是进程之间的相互通信,分别有两种方式:一种是队列,另一种是管道

      队列的原理是:先进先出,只能是一头传入数据,另一头读取数据。管道+锁就能实现队列。

      管道的原理是:

      队列和管道实现了多个进程之间的共享内存空间。

     Queue:指定队列中存放的数据个数。

     put:写入数据

     get:读取数据

    import multiprocessing
    q=multiprocessing.Queue(5)
    q.put(111)
    q.put(222)
    q.put(333)
    q.put(444)
    q.put(555)
    
    print(q.get())
    print(q.get())
    print(q.get())
    print(q.get())
    print(q.get())
    

     注意:如果put 和 get 超出了定义存放的个数,就会阻塞

     put_nowait:上传数据,如果超出了存放数据的个数就会抛出异常

     get_nowait:读取数据,如果超出了存放数据的个数就会抛出异常

    import multiprocessing
    q=multiprocessing.Queue(5)
    q.put_nowait(1)
    q.put_nowait(2)
    q.put_nowait(3)
    q.put_nowait(4)
    q.put_nowait(5)
    print(q.get_nowait())
    print(q.get_nowait())
    print(q.get_nowait())
    print(q.get_nowait())
    print(q.get_nowait())
    

     四 生产者和消费者

     生产者:创建数据

     消费者:读取(处理)数据

      生产者和消费者都是由都列分离开的。

       生产者创建数据,然后存放到队列里面,接着消费者在队列里面读取数据

    import multiprocessing
    import random
    import time
    def producer(q):
        for i in range(1,30):
            time.sleep(random.random())
            q.put('包子%s'%i)
            print('厨师%s创建了包子%s'%('egon'+str(random.randint(1,5)),i))
    def consumer(q):
        while True:
            ret=q.get()
            if ret is None:break
            time.sleep(random.random())
            print('%s吃了包子%s'%('alex'+str(random.randint(1,5)),ret))
    if __name__=='__main__':
        q = multiprocessing.Queue()
        c_s=multiprocessing.Process(target=producer,args=(q,))
        x_f=multiprocessing.Process(target=consumer,args=(q,))
        c_s.start()
        x_f.start()
        c_s.join()
        q.put(None)
    

     注意:在消费者执行完过后需要加上一个终止条件,不然代码就会一直在那里等待着。

     处理生产者和消费者直接的数据平衡的速度差

      如何平衡:生产者--------》队列-------》消费者     (生产者和消费者解耦)

  • 相关阅读:
    Python之描述器
    Python魔术方法
    Python二分法查找
    Qt连接oracle
    oracle11g下载安装
    Qwidget,QMainWindow ,Qdialog
    动态库
    静态库
    Qt翻译文件
    Qt 日志界面类
  • 原文地址:https://www.cnblogs.com/fangjie0410/p/7652339.html
Copyright © 2011-2022 走看看