进程、线程、协程的区别
进程:操作系统进行资源分配和调度的基本单位, 多个进程之间相互独立。不共享资源
线程:CUP进行资源分配和调度的基本单位, 线程是进程的一部分。同一进程下的不同线程共享该进程的所有资源。
区别:
-
进程:各个进程之间相互独立,稳定性好, 一个进程崩溃, 不影响其他进程。但是进程消耗的资源多。
-
线程:运行效率高, 缺点是稳定性没进程这么好。一个线程崩溃。都会造成进程的崩溃。
应用:
-
IO密集的多用于多线程
-
CUP密集的多用于进程。(因为加入IO操作少, 用多线程的话,因为线程共享一个全局解释器锁, 档钱运行的线程会霸占GIL, 就不能利用多核CPU的有事)
-
协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但是必须自己调度。
通过生成器实现协程
import time
def task_a():
while True:
print("task_a before")
time.sleep(1)
print("task_a after")
def task_b():
while True:
print("task_b before")
time.sleep(1)
print("task_b after")
t1 = task_a()
t2 = task_b()
while True:
next(t1)
print("----------")
next(t2)
asyncio实现携程
import asyncio
async def task_a():
while True:
print("hello world")
await asyncio.sleep(1)
async def task_b():
while True:
print("goodbye world")
await asyncio.sleep(1)
c1 = task_a()
c2 = task_b()
c = asyncio.gather(c1, c2) # 如果有多个异步程序,则用这个管理。
loop = asyncio.get_event_loop()
loop.run_until_complete(c)
import asyncio
import random
# 需求: 做一个调度器, 每秒增加一个job, job作为爬取网页。
def callback(future):
print("callback:",future.result())
async def job(url):
n = random.randrange(1, 3)
await asyncio.sleep(n)
print("下载成功:{0}".format(url))
return url
async def cron():
page = 1
while True:
await asyncio.sleep(1)
j = job("www.baidu.com/{0}".format(page))
task = asyncio.create_task(j)
task.add_done_callback(callback)
page += 1
# 加了async关键字的函数,都需要注册给loop进行调控
# await 用来用来声明程序挂起。
loop = asyncio.get_event_loop() # linxu的epoll
c = cron()
loop.run_until_complete(c)