进程:互相独立运行,通过共享内存,消息队列进行通讯,不能直接共享信息;
线程:同一个进程的多条线程内存是共享的,所有变量都有所有线程共享;
是由CPU调度,会出现并发问题
一个进行至少包含1个线程;一个进程崩溃对其他进程没有影响;一个线程崩溃同一线程的其他进程也会崩溃;
协程:与子程序(或者说函数)一样,也是一种程序组件;协程允许有多个入口对程序进行中断,继续执行操作;
协程存活在多线程中,一个线程可以有很多的协程;
corotine是由python自身调度, 协程多个任务是在同一个线程,同一个线程分配,则不会出现并发冲突
import asyncio
import time
async def say_later(delay,what):
await asyncio.sleep(delay)
print(what)
#累计耗时3s
# async def main():
# star = time.time()
# await say_later(1, "hello")
# await say_later(2, "word")
# end = time.time()
# print(f'总计耗时{end-star:.2}')
# asyncio.run(main())
async def main():
star = time.time()
#asyncio.create_task() 函数用来 并发 运行作为 asyncio 任务 的多个协程。
print(f'开始时间{time.strftime("%X")}')
t1 = asyncio.create_task(say_later(1, "hello"))
t2 = asyncio.create_task(say_later(2, "word"))
await t1
await t2
print(f'结束时间{time.strftime("%X")}')
end = time.time()
print(f'总计耗时{end-star:.2}')
asyncio.run(main())
# 如果协程函数main()是程序的主入口,则使用asyncio.run()调用执行
# 函数 asyncio.run() 在一个程序中只能调用一次,如果有多次则返回异常;
await 可等待对象有三种主要类型: 协程, 任务 和 Future.
await必须在协程中才可以使用(协程:包含async的函数);
任务(可等待对象):被用来设定日程,以便并发执行;asyncio.creat_task() 只有任务才能并发执行; 任务需放在协程函数中执行、
只有协程函数和asyncio.run()才能调用协程函数及任务。
调用协程函数三种方式:await(所在的函数必须是协程-async函数) , asyncio.run(),aysncio.creat_task()
如果要求并发通过任务creat_task() 来执行,如果不需要并发用await()执行即可
并发任务执行案例:
# -*- coding: utf-8 -*-
import asyncio
count = 0
async def add():
global count
for _ in range(100000):
count += 1
# print(count)
async def main():
# gather并发运行任务
# corotine = [add() for _ in range(10)]
# await asyncio.gather(*corotine)
# print(count)
t = []
# 任务放在一起,同时进行并发执行
for _ in range(100):
crco = asyncio.create_task(add())
t.append(crco)
for i in t:
await i
print(count)
asyncio.run(main())