进程和线程是不可以无限制的创建
因为硬件的发展赶不上软件,有物理极限,如果我们在编写代码的过程中无限制的创建进程或者线程会导致计算机崩溃
池
降低程序的执行效率,但是保证了计算机硬件的安全
进程池
提前创建好固定数量的进程供后续程序的调用,超出则等待
线程池
提现创建好固定数量的线程供后续程序的调用,超出则等待
'创建线程(进程)池'
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import os
import time
import random
from threading import current_thread
# 1.产生含有固定数量线程的线程池
pool = ThreadPoolExecutor(10) # 创建固定10个线程的线程池
pool1 = ProcessPoolExecutor(5) # 固定5个进程的进程池
def task(n):
print('task is running')
time.sleep(random.randint(1, 3))
print('task is over', n, current_thread().name)
return '我是task函数的返回值'
def func(*args, **kwargs):
print('from func')
if __name__ == '__main__':
# 直接将任务提交给线程池久远可以了
for i in range(20):
pool.submit(task, 123).add_done_callback(func)
# 这句话表示将函数task函数提交给线程池,然后获取的返回值直接作为参数传入func函数,执行,这样必须一个进程或者线程执行完毕task函数之后才可以执行func
携程
"""
进程:资源单位
线程:执行单位
携程:单线程下实现并发(效率极高)
在代码层面欺负CPU,让CPU认为我们的代码里面没有IO操作
实际上IO操作被我们自己写的代码检测,一旦有,立刻让代码 执行别的
核心:自己写的代码完成切换+保存状态
"""
import time
from gevent import monkey;
monkey.patch_all() # 固定编写 用于检测所有的IO操作(猴子补丁)
from gevent import spawn
def func1():
print('func1 running')
time.sleep(3)
print('func1 over')
def func2():
print('func2 running')
time.sleep(5)
print('func2 over')
if __name__ == '__main__':
start_time = time.time()
# func1()
# func2()
s1 = spawn(func1) # 检测代码 一旦有IO自动切换(执行没有io的操作 变向的等待io结束)
s2 = spawn(func2)
s1.join()
s2.join()
print(time.time() - start_time) # 8.01237154006958 协程 5.015487432479858
携程实现并发
import socket
from gevent import monkey;monkey.patch_all() # 固定编写 用于检测所有的IO操作(猴子补丁)
from gevent import spawn
def communication(sock):
while True:
data = sock.recv(1024)
print(data.decode('utf8'))
sock.send(data.upper())
def get_server():
server = socket.socket()
server.bind(('127.0.0.1', 8080))
server.listen(5)
while True:
sock, addr = server.accept() # IO操作
spawn(communication, sock)
s1 = spawn(get_server)
s1.join()
如何不断的提升程序的运行效率
多进程下开多线程 多线程下开协程