怎么能解決問題 HTTP請(qǐng)求中同步與異步有什么不同?
HTTP請(qǐng)求中同步與異步有什么不同?例如:公共B/S模式(同步)Ajax技術(shù)(異步)同步:提交請(qǐng)求->等待服務(wù)器處理->完成處理。在此期間,客戶端瀏覽器不能異步執(zhí)行任何操作:請(qǐng)求由事件觸發(fā)-&
HTTP請(qǐng)求中同步與異步有什么不同?
例如:公共B/S模式(同步)Ajax技術(shù)(異步)同步:提交請(qǐng)求->等待服務(wù)器處理->完成處理。在此期間,客戶端瀏覽器不能異步執(zhí)行任何操作:請(qǐng)求由事件觸發(fā)->服務(wù)器處理(這是指瀏覽器仍可以執(zhí)行其他操作)->完成處理同步意味著如果您要我吃飯,我聽到后會(huì)和您一起吃飯;如果您沒有聽到,你會(huì)一直打電話,直到我告訴你我聽到了。異步意味著你打電話給我,我自己去吃飯。我可能在得到消息后馬上離開,或者等到下班后再去吃飯。所以,如果你想讓我請(qǐng)你吃飯,用同步的方法,如果你想請(qǐng)我吃飯,用異步的方法,這樣你就可以省錢了。
Flask怎么實(shí)現(xiàn)異步任務(wù)處理方式呢?
有時(shí)HTTP請(qǐng)求的處理時(shí)間太長(zhǎng),部分代碼不需要同步執(zhí)行。我們可以使用下面的函數(shù)來拋出任務(wù)以異步執(zhí)行,接口將立即返回。
此函數(shù)的具體執(zhí)行過程如下:
調(diào)用時(shí)復(fù)制當(dāng)前請(qǐng)求上下文(request)
原始請(qǐng)求將立即繼續(xù)執(zhí)行
執(zhí)行func時(shí),將推送復(fù)制的請(qǐng)求。從此以后,它可以被視為一個(gè)新任務(wù)
需要注意的是,由于復(fù)制的請(qǐng)求被推入,所以“before”請(qǐng)求信號(hào)不會(huì)被觸發(fā)。但在那之后,在“請(qǐng)求”和“撕裂”之后,會(huì)有更多的請(qǐng)求。而且,因?yàn)橹粡?fù)制了請(qǐng)求,所以不會(huì)復(fù)制其他上下文變量,例如﹣g。
朗:蟒蛇
import gevent
from flask import copy current request context
def i have a Dream(func,*args,**kwargs):
“”“
異步任務(wù)處理。此函數(shù)立即返回,并使用gevent的新線程執(zhí)行func函數(shù)(使用請(qǐng)求上下文)。
“”“
返回gevent.spawn文件(復(fù)制當(dāng)前請(qǐng)求上下文(func),*args,**kwargs)
http異步請(qǐng)求和多線程的區(qū)別?
異步:異步和同步是相對(duì)的。同步是順序執(zhí)行。在一次執(zhí)行之后,下一次需要等待和協(xié)調(diào)。異步意味著它們彼此獨(dú)立,在等待事件的過程中繼續(xù)做自己的事情。無需等待事件完成后才能工作。線程是實(shí)現(xiàn)異步的一種方法。異步意味著調(diào)用方法的主線程不需要等待另一個(gè)線程同步完成,這樣主線程就可以做其他事情。多線程:多線程是程序設(shè)計(jì)的邏輯層概念。它是一段在進(jìn)程中并發(fā)運(yùn)行的代碼。多線程可以在線程之間切換。異步和多線程是不相等的。異步是最終的目標(biāo)。多線程只是實(shí)現(xiàn)異步的一種手段。異步是將調(diào)用請(qǐng)求發(fā)送給被調(diào)用方,調(diào)用方可以在不等待結(jié)果返回的情況下執(zhí)行其他操作。為了實(shí)現(xiàn)異步,我們可以使用多線程技術(shù),或者將它交給另一個(gè)進(jìn)程。