import time
import asyncio
#并行处理的几种方式
#多进程，消耗更多资源（独立内存空间，文件描述符）（几十个上百个），
# 切换成本高（整个进程上下文，内存空间），
# 通讯成本高（管道，队列），安全性高

#多线程，消耗较少资源（共享内存空间）（几千个），
# 切换成本低（只需保存少量寄存器内容）（内核态，微秒级），
# 通讯成本低（共享内存），安全性较低

#协程，资源消耗极少（极少量内存）（几十万个），
# 切换成本低（只需切换寄存器内容）（用户态，纳秒级），
# 通讯成本低（共享内存，无需内核介入），安全性较高

#普通任务
def do_some_thing(i):
    print("开始执行任务:"+str(i))
    time.sleep(5)
    print("已经完成任务" + str(i))

#协程任务
async def do_some_thing_asynic(i):
    print("开始执行任务:"+str(i))
    await asyncio.sleep(5)
    print("已经完成任务" + str(i))

#多进程
from multiprocessing import Process
def test_multi_process():
    for i in range(10):
        t = Process(target=do_some_thing, args=(i,))
        t.start()


#多线程
import threading
def test_multi_thread():
    for i in range(10):
        t = threading.Thread(target=do_some_thing, args=(i,))
        t.start()

#协程
async def test_asyncio():
    tasks = []
    for i in range(10):
        tasks.append(do_some_thing_asynic(i))
    await asyncio.gather(*tasks)


if __name__ == '__main__':
    #test_multi_process()
    #test_multi_thread()
    asyncio.run(test_asyncio())