Py004-01-20同步和异步的差别

线程池的同步异步

提交任务的两种方式

同步调用

提交完任务后,就在原地等待任务执行完毕,拿到结果,再执行下一行代码,导致程序是串行执行

1
2
3
4
5
6
生活实例:老板叫你去买苹果
前提——你的老板很耿直偏要看着你买回来
1-你没买到之前他就一直wait
2-你买到了苹果
3-你回来了
4-他拿着苹果啃了一口(还是苹果好吃啊!!!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from concurrent.futures import ThreadPoolExecutor
import time
import random

def la(name):
print('%s is laing' %name)
time.sleep(random.randint(3,5))
res=random.randint(7,13)*'#'
return {'name':name,'res':res}

def weigh(shit):
name=shit['name']
size=len(shit['res'])
print('%s 拉了 《%s》kg' %(name,size))


if __name__ == '__main__':
pool=ThreadPoolExecutor(13)

shit1=pool.submit(la,'alex').result()
weigh(shit1)

shit2=pool.submit(la,'wupeiqi').result()
weigh(shit2)

shit3=pool.submit(la,'yuanhao').result()
weigh(shit3)

异步调用

提交完任务后,不等待任务执行完毕

1
2
3
4
5
6
生活实例:老板叫你去买苹果,并告诉你,你搞定了告诉他一声
前提——你的老板很耿直偏要看着你买回来
1-你没买到之前他就去忙其他事了
2-你买到了苹果,他在王者荣耀
3-你回来了,他在吃鸡
4-你通知他苹果买好了,他咬了口苹果又去吃鸡了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from concurrent.futures import ThreadPoolExecutor
import time
import random

def la(name):
print('%s is laing' %name)
time.sleep(random.randint(3,5))
res=random.randint(7,13)*'#'
return {'name':name,'res':res}


def weigh(shit):
shit=shit.result()
name=shit['name']
size=len(shit['res'])
print('%s 拉了 《%s》kg' %(name,size))


if __name__ == '__main__':
pool=ThreadPoolExecutor(13)

pool.submit(la,'alex').add_done_callback(weigh)

pool.submit(la,'wupeiqi').add_done_callback(weigh)

pool.submit(la,'yuanhao').add_done_callback(weigh)