對Python協(xié)程之異步同步的區(qū)別詳解
一下代碼通過協(xié)程、多線程、多進(jìn)程的方式,運(yùn)行代碼展示異步與同步的區(qū)別。
import gevent
import threading
import multiprocessing
# 這里展示同步和異步的性能區(qū)別,可以看到異步直接同時(shí)執(zhí)行并完成,
# 而同步,需要等待第一個(gè)完成后再次執(zhí)行下一個(gè),是有順序的執(zhí)行,而異步不需要
import time
def task(pid):
gevent.sleep(0.5)
print('Task %s done' % pid)
def task2(pid):
time.sleep(0.5)
print('Task %s done'%pid)
def synchronous():
for i in range(1, 10):
task(i)
def asynchronous():
threads = [gevent.spawn(task, i) for i in range(1,10)]
gevent.joinall(threads)
def thread_chronous():
t_list = []
for i in range(1,10):
t = threading.Thread(target=task2,args=(i,))
t.start()
t_list.append(t)
for j in t_list:
j.join()
def multi_chronous():
t_list = []
for i in range(1, 10):
t = multiprocessing.Process(target=task2, args=(i,))
t.start()
t_list.append(t)
for j in t_list:
j.join()
# 同步執(zhí)行
print('Synchronous:')
synchronous()
# 開啟協(xié)程異步執(zhí)行 自動(dòng)切換函數(shù)
print('Asynchronous:')
asynchronous()
# 開啟線程異步執(zhí)行
print('Threading')
thread_chronous()
# 開啟進(jìn)程的異步執(zhí)行
if __name__ == '__main__':
print('Multiprocess')
multi_chronous()
關(guān)于異步 同步的一些理解:
同步和異步的區(qū)別就在于是否等待IO執(zhí)行的結(jié)果。好比你去麥當(dāng)勞點(diǎn)餐,你說“來個(gè)漢堡”,服務(wù)員告訴你,對不起,漢堡要現(xiàn)做,需要等5分鐘,于是你站在收銀臺前面等了5分鐘,拿到漢堡再去逛商場,這是同步IO。
你說“來個(gè)漢堡”,服務(wù)員告訴你,漢堡需要等5分鐘,你可以先去逛商場,等做好了,我們再通知你,這樣你可以立刻去干別的事情(逛商場),這是異步IO。
老張愛喝茶,廢話不說,煮開水。出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。
1 老張把水壺放到火上,立等水開。(同步阻塞)老張覺得自己有點(diǎn)傻
2 老張把水壺放到火上,去客廳看電視,時(shí)不時(shí)去廚房看看水開沒有。(同步非阻塞)老張還是覺得自己有點(diǎn)傻,于是變高端了,買了把會響笛的那種水壺。水開之后,能大聲發(fā)出嘀~~~~的噪音。
3 老張把響水壺放到火上,立等水開。(異步阻塞)老張覺得這樣傻等意義不大
4 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(異步非阻塞)老張覺得自己聰明了。所謂同步異步,只是對于水壺而言。普通水壺,同步;響水壺,異步。雖然都能干活,但響水壺可以在自己完工之后,提示老張水開了。這是普通水壺所不能及的。同步只能讓調(diào)用者去輪詢自己(情況2中),造成老張效率的低下。所謂阻塞非阻塞,僅僅對于老張而言。立等的老張,阻塞;看電視的老張,非阻塞。情況1和情況3中老張就是阻塞的,媳婦喊他都不知道。雖然3中響水壺是異步的,可對于立等的老張沒有太大的意義。所以一般異步是配合非阻塞使用的,這樣才能發(fā)揮異步的效用。
以上這篇對Python協(xié)程之異步同步的區(qū)別詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python時(shí)間處理模塊time和datetime詳解
本文詳細(xì)介紹了Python中常用的時(shí)間處理模塊time和datetime,time模塊提供多種時(shí)間獲取和轉(zhuǎn)換功能,datetime模塊則在time的基礎(chǔ)上增加了日期和時(shí)間的組合處理,如datetime.now()獲取當(dāng)前日期時(shí)間,兩個(gè)模塊在日常編程中非常有用,尤其是在需要時(shí)間日期計(jì)算和轉(zhuǎn)換的場景下2024-10-10
python3 圖片 4通道轉(zhuǎn)成3通道 1通道轉(zhuǎn)成3通道 圖片壓縮實(shí)例
今天小編就為大家分享一篇python3 圖片 4通道轉(zhuǎn)成3通道 1通道轉(zhuǎn)成3通道 圖片壓縮實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
python打印異常信息的兩種實(shí)現(xiàn)方式
今天小編就為大家分享一篇python打印異常信息的兩種實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
python中文件變化監(jiān)控示例(watchdog)
這篇文章主要介紹了python中文件變化監(jiān)控示例(watchdog),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10
簡單介紹Python的Tornado框架中的協(xié)程異步實(shí)現(xiàn)原理
這篇文章主要介紹了簡單介紹Python的Tornado框架中的協(xié)程異步實(shí)現(xiàn)原理,作者基于Python的生成器講述了Tornado異步的特點(diǎn),需要的朋友可以參考下2015-04-04
Python如何通過subprocess調(diào)用adb命令詳解
python可以說是寫一些小腳本的利器語法簡單,做為最著名的就“膠水語言”用它來寫一些命令腳本非常的方便。下面這篇文章主要給大家介紹了關(guān)于Python如何通過subprocess調(diào)用adb命令的相關(guān)資料,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08

