python异步和进程_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()

你可能感兴趣的:(python异步和进程)