關於python協程與非同步舉例

2021-07-22 07:38:46 字數 1582 閱讀 8727

寫了幾個介面,也就接觸到了python的非同步。

python的協程使用非同步實現的(說法不知道準不準確),所以直接使用協程來做,看的很多例子也是這麼幹的

先看**:

import json

import tornado

import tornado.web

from tornado import gen

from tornado.options import define, options

define('port', default=8000, help='run on the given port', type = int)

@tornado.gen.coroutine

def count():

print '-------sleep begin'

gen.sleep(10)

print '-------sleep finish'

r = {}

r['s'] = 1

raise tornado.gen.return(r)

class test1(tornado.web.requesthandler):

@tornado.gen.coroutine

def get(self):

print '------test1'

r = yield count()

s = 'return of test1\n'

print 'count returns'

self.write(s)

self.write(json.dumps(r))

class test2(tornado.web.requesthandler):

@tornado.gen.coroutine

def get(self):

print 'do test2'

self.write('test2 begin \n')

self.write('test2 end')

(r'/cor/test1', test1),

(r'/cor/test2', test2)

])if __name__ == '__main__':

tornado.ioloop.ioloop.instance().start()

說明:1. 要測試的流程是先請求test1,再請求test2, 看test2能否直接返回結果

2.  在test1中,使用gen.coroutine和yield配合,講其中的count呼叫標記為非同步(我自己想的說法),這樣r作為佔位符存在,此後cpu會輪詢的檢查r是否完成

3. gen模組內的sleep是用非同步實現的,所以執行後會立即釋放執行緒控制權,所以列印結果時'---------sleep being'和'----------sleep end'和'count returns'是先後

直接列印出來的。 而sleep換成time模組的sleep就不會實現非同步,因為time的sleep不是非同步,會一直佔執行緒的控制權。 所以要用非同步,前提是非同步的函式

自己支援非同步。這意味著cpu密集型的函式用非同步做就沒有意義。很鬱悶。可能還有其他方法,有待研究,文章會隨時更新

python協程與非同步協程

在前面幾個部落格中我們一一對應解決了消費者消費的速度跟不上生產者,浪費我們大量的時間去等待的問題,在這裡,針對業務邏輯比較耗時間的問題,我們還有除了多程序之外更優的解決方式,那就是協程和非同步協程。在引入這個概念之前我們先看 看這個圖 從這個我們可以看出來,假如來了9個任務,即使我們開了多程序,在業...

python 非同步與協程學習

參考 深入理解python非同步程式設計 理解 python asyncio 1 非同步非租塞 以春運火車票為例,非同步 你使用分流軟體搶票,設定好時間型別,軟體自動執行 非阻塞 你不用等搶票結果,可以去做別的事 如何獲得結果 輪詢 每隔一段時間,你看一下搶到票沒有 事件通知 設定搶到票,郵件或者簡...

http 協程與非同步 Python

協程是啥 簡單來說,協程是一種基於執行緒之上,但又比執行緒更加輕量級的存在。對於系統核心來說,協程具有不可見的特性,所以這種由 程式設計師自己寫程式來管理的輕量級執行緒又常被稱作 使用者空間執行緒 協程比多執行緒好在哪 適用場景 協程適用於被阻塞的,且需要大量併發的場景。不適用場景 協程不適用於存在...