• Python并发编程-进程池及异步方式


    进程池的基本概念

    • 为什么有进程池的概念

      • 效率问题
      • 每次开启进程,都需要开启属于这个进程的内存空间
      • 寄存器,堆栈
      • 进程过多,操作系统的调度
    • 进程池

      • python中的 先创建一个属于进程的池子
      • 这个池子指定能存放多少进程
      • 先将这些进程创建好
    • 更高级的进程池

      • 3,20
      • 默认启动3个进程
      • 处理能力不够的时候,加进程
      • 最多20个
      • python中没有
    from multiprocessing import Pool,Process
    import time
    #Process就无需使用了
    
    def func(n):
        for i in range(10):
            print(n+1)
    #下面这段比较进程池和多进程所需时间的不同
    if __name__ == '__main__':
        start = time.time()
        pool = Pool(5)             #启动5个进程
        pool.map(func, range(100)) #range处必须是可迭代的参数,100个任务
        t1 = time.time()-start
        start = time.time()
        p_lst = []
        for i in range(100):
            p = Process(target=func, args=(i, ))
            p_lst.append(p)
            p.start()
        for p in p_lst: p.join()
        t2 = time.time()-start
        print(t1,t2)
    

    async异步方式

    from multiprocessing import Pool
    import time
    import os
    
    def func(n):
        print('start func%s'%n,os.getpid())
        time.sleep(1)
        print('end func%s'%n,os.getpid())
    if __name__ == '__main__':
        p = Pool()
        for i in range(10):
            p.apply_async(func,args=(i,)) #apply为同步执行任务, apply_async异步执行任务
        p.close() #必须先要close
        p.join() #感知进程池中的任务执行结束
    

    利用异步方式创建Socket Server

    # server.py
    from multiprocessing import Pool
    import  socket
    
    def func(conn):
        conn.send(b'hello')
        print(conn.recv(1024).decode('utf-8'))
        conn.close()
    
    if __name__ == '__main__':
        p = Pool(5)
        sk = socket.socket()
        sk.bind(('127.0.0.1', 8080))
        sk.listen()
        while True:
            conn,addr = sk.accept()
            p.apply_async(func,args=(conn,))
    
        sk.close()
    
    #client.py
    
    import  socket
    
    sk = socket.socket()
    sk.connect(('127.0.0.1',8080))
    
    ret = sk.recv(1024).decode('utf-8')
    print(ret)
    msg = input('>>>').encode('utf-8')
    sk.send(msg)
    sk.close()
    
  • 相关阅读:
    创建两种dialog的方法
    m^n实现,利用递归的方法
    MFC中SendMessage和PostMessage两种发送消息用法
    char *的十六进制字符串转化成long
    MFC禁用关闭按钮、最小化、最大化
    didReceiveMemoryWarning
    dispatch_async 与 dispatch_get_global_queue
    iphone中Button的currentTitle和titleLabel.text的使用
    IOS开发之手势——UIGestureRecognizer 共存
    Android中的Activity的生命周期图
  • 原文地址:https://www.cnblogs.com/konglinqingfeng/p/9699265.html
Copyright © 2020-2023  润新知