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()
原文地址:https://www.cnblogs.com/konglinqingfeng/p/9699265.html