• python:进程操作


    一、多进程应用

    import socket
    from multiprocessing import Process
    
    def talk(conn):
        conn.send(b'connected')
        ret = conn.recv(1024)
        print(ret)
    
    if __name__ == '__main__':
        sk = socket.socket()
        sk.bind(('127.0.0.1', 8080))
        sk.listen()
        while True:
            conn,addr = sk.accept()
            p = Process(target=talk,args=(conn,))
            p.start()
        conn.close()
        sk.close()
    server
    import socket
    sk = socket.socket()
    sk.connect(('127.0.0.1',8080))
    ret = sk.recv(1024)
    print(ret)
    msg = input('>>>')
    sk.send(msg.encode('utf-8'))
    sk.close()
    client

    二、进程中的其他方法

    import time
    from multiprocessing import Process
    def func():
        print('--'*10)
        time.sleep(15)
        print('--'*10)
    
    def cal_time():
        while True:
            time.sleep(1)
            print('过去了1秒')
    
    if __name__ == '__main__':
        p = Process(target=cal_time)
        p.daemon = True     #守护进程:一定在开启进程之前设置
        p.start()
        p2 = Process(target=func)  # 15s
        p2.start()
        for i in range(100):    # 10s
            time.sleep(0.1)
            print('*'*i)
        p2.join()

    1,start()开启一个进程

    join:用join可以让主进程等待子进程结束

    1)p.daemon =True #守护进程

    守护进程会随着主进程的代码执行结束而结束

    正常的子进程没有执行完的时候主进程要一直等着

    2)守护进程的作用

    会随着主进程的代码执行结束而结束,不会等待其他子进程

    3)注意:

    守护进程要在start之间设置

    守护进程中不能再开启子进程

    2,is_alive与terminate

    import time
    from multiprocessing import Process
    def func():
        print('wahaha')
        time.sleep(5)
        print('qqxing')
    if __name__ == '__main__':
        p = Process(target=func)
        p.start()
        print(p.is_alive())  
        time.sleep(0.1)
        p.terminate()        
        print(p.is_alive())  
        time.sleep(1)
        print(p.is_alive())
    p.is_alive()   # 是否活着 True代表进程还在 False代表进程不在了
    p.terminate() # 结束一个进程,但是这个进程不会立刻被杀死
    def func():
        print('wahaha')
        time.sleep(5)
        print('qqxing')
    if __name__ == '__main__':
        p = Process(target=func)
        p.start()
        print(p.name,p.pid)
        p.name = '哇哈哈哈'
        print(p.name)
    
    class MyProcess(Process):
        def run(self):
            print('wahaha',self.name,self.pid)
            time.sleep(5)
            print('qqxing',self.name,self.pid)
    if __name__ == '__main__':
        p = MyProcess()
        p.start()
        print(p.pid)
    # pid   查看这个进程 进程id
    # name  查看这个进程的名字

    三、锁

    from multiprocessing import Lock#调用锁
    lock = Lock() #创建一个锁
    lock.acquire()  # 需要锁   拿钥匙
    lock.acquire()  # 需要锁   发生阻塞
    
    lock.release()  # 释放锁  还钥匙
    锁 就是在并发编程中 保证数据安全
    import json
    import time
    import random
    from multiprocessing import Lock
    from multiprocessing import Process
    
    def search(i):
        with open('ticket') as f:
            print(i,json.load(f)['count'])
    
    def get(i):
        with open('ticket') as f:
            ticket_num = json.load(f)['count']
        time.sleep(random.random())
        if ticket_num > 0:
            with open('ticket','w') as f:
                json.dump({'count':ticket_num-1},f)
            print('%s买到票了'%i)
        else:
            print('%s没票了'%i)
    
    def task(i,lock):
        search(i)   # 查看票
        lock.acquire()
        get(i)      # 抢票
        lock.release()
    
    if __name__ == '__main__':
        lock = Lock()
        for i in range(20):  # 20个人同时抢票
            p = Process(target=task,args=(i,lock))
            p.start()
    import json
    import time
    import random
    from multiprocessing import Lock
    from multiprocessing import Process
    
    def search(i):
        with open('ticket') as f:
            print(i,json.load(f)['count'])
    
    def get(i):
        with open('ticket') as f:
            ticket_num = json.load(f)['count']
        time.sleep(random.random())
        if ticket_num > 0:
            with open('ticket','w') as f:
                json.dump({'count':ticket_num-1},f)
            print('%s买到票了'%i)
        else:
            print('%s没票了'%i)
    
    def task(i,lock):
        search(i)   # 查看票
        lock.acquire()
        get(i)      # 抢票
        lock.release()
    
    if __name__ == '__main__':
        lock = Lock()
        for i in range(20):  # 20个人同时抢票
            p = Process(target=task,args=(i,lock))
            p.start()
    买火车票的程序

    四、信号量

    import time
    import random
    from multiprocessing import Semaphore#调用信号量
    from multiprocessing import Process
    def sing(i,sem):
        sem.acquire()
        print('%s : 进入 ktv'%i)
        time.sleep(random.randint(1,10))
        print('%s : 出 ktv'%i)
        sem.release()
    # 迷你唱吧  20个人,同一时间只能有4个人进去唱歌
    if __name__ == '__main__':
        sem = Semaphore(4)
        for i in range(20):
            Process(target=sing,args=(i,sem)).start()
    #信号量的数量就是锁当中钥匙的数量

    五、事件

    事件 —— 异步阻塞
    事件是所有的进程,都陷入阻塞
    from multiprocessing import Event   #调用事件模块
    # e = Event() # 实例化一个事件  标志/类似于交通信号灯
    # e.set()     # 将标志变成非阻塞/类似于交通灯变绿
    # e.wait()    # 刚实例化出来的一个事件对象,默认的信号是阻塞信号/默认是红灯
    #             # 执行到wait,要先看灯,绿灯行红灯停,如果在停的过程中灯绿了,
    #             # 就变成非阻塞了
    # e.clear()   # 将标志又变成阻塞/交通灯变红
    #
    # e.is_set() # 是否阻塞 True就是绿灯 False就是红灯
    import time
    import random
    from multiprocessing import Process
    from multiprocessing import Event
    def traffic_light(e):
        while True:
            if e.is_set():
                time.sleep(3)
                print('红灯亮')
                e.clear()      # 绿变红
            else:
                time.sleep(3)
                print('绿灯亮')
                e.set()        # 红变绿
    
    def car(i,e):
        e.wait()
        print('%s车通过'%i)
    
    if __name__ == '__main__':
        e = Event()   # 立一个红灯
        tra = Process(target=traffic_light,args=(e,))
        tra.start()   # 启动一个进程来控制红绿灯
        for i in range(100):
            if i%6 == 0 :
                time.sleep(random.randint(1,3))
            car_pro = Process(target=car, args=(i,e))
            car_pro.start()

    六、队列

    队列进程之间的通信
    1.进程之间通信 可以使用multiprocessing 的 Queue模块
    2.队列有两种创建方式 第一种不传参数 这个队列就没有长度限制 ;传参数,创建一个有最大长度限制的队列
    3.提供两个重要方法;put get
    4.qsize查看队列的大小
    import time
    def producer(q):  # 生产者
        for i in  range(100):
            q.put('包子%s'%i)
    
    def consumer(q): #  消费者
        for i in range(100):
            time.sleep(1)
            print(q.get())
    
    if __name__ == '__main__':
        q = Queue(10)   # 托盘
        p = Process(target=producer,args=(q,))
        p.start()
        c1 = Process(target=consumer, args=(q,))
        c2 = Process(target=consumer, args=(q,))
        c1.start()
        c2.start()
  • 相关阅读:
    .net framework 3.5 dotNetFx35setup 能不需要网络支持吗? 
    Android API Differences Report
    Android用户版本分布更新 2.1版领先
    Adobe升级Flash回击批评:流畅播放手机视频
    iPhone OS4.0,Android 2.1和WP7对比分析
    Android 2.2数据共享功能开启与否将由运营商自主决定
    谷歌 Android 3.0计划四季度推出:代号姜饼
    谷歌称Android设备日激活量已达10万台
    iPod Touch也将支持运行Android系统
    Android2.2 SDK正式提供下载
  • 原文地址:https://www.cnblogs.com/kakawith/p/8406056.html
Copyright © 2020-2023  润新知