龍捲風正在單線程中運行。
在一個時間點,是否只有一個功能運行?
所以我不必鎖定保護變量?
即使這些功能是異步的?需要保護龍捲風的全局變量嗎?
回答
龍捲風函數不間斷運行,直到「yield」表達式(如果函數是協程)或函數返回。所以答案是否定的,你通常不需要用Tornado應用程序中的鎖來保護全局變量。
如果您只需要一個協程可以使用共享的全局變量,那麼Python的標準線程.Lock就是實現這一目標的錯誤方法。 (事實上,在單線程Tornado應用程序中使用threading.Lock會導致死鎖。)而是使用tornado.locks.Lock來協調協程的訪問。但這是一種先進的用例,你幾乎不用擔心。
爲背景,讀銘文著名的「硬骨頭」文章:基於回調
https://glyph.twistedmatrix.com/2014/02/unyielding.html
這是關於雙絞線,但對於異步coroutine-和應用程序一般。
前兩句似乎在異步,非阻塞堆棧中相互矛盾。 – kwarunek
如果在IOLoop中調度使用該變量的兩個或多個函數,則需要保護全局變量。例如。而異步處理許多http請求。
您可以使用toro's Lock在龍捲風4.2+中,您可以使用tornado.locks,因爲toro已合併到Tornado中。
的情況下:
- 有修飾
test_var
並調用一個從屬函數的功能,即需要更長的時間 - 則存在清除
test_var
實施例功能:
from tornado.ioloop import IOLoop
from tornado import gen
import time
test_var = 'test'
@gen.coroutine
def sleep():
yield gen.Task(IOLoop.instance().add_timeout, time.time() + 0.1)
@gen.coroutine
def depend_on_test_var():
yield sleep()
print('depend_on_test %s' % test_var)
@gen.coroutine
def set_test_var():
global test_var
test_var = 'set'
yield depend_on_test_var()
@gen.coroutine
def clear_test_var():
global test_var
test_var = 'clear'
@gen.coroutine
def main():
print('main start %s' % test_var)
yield [
set_test_var(),
clear_test_var()
]
IOLoop.instance().run_sync(main)
它一次運行一個功能。由於yield
非阻塞函數(asynchttpclient,異步睡眠等)意味着做了一些其他的事情,直到它完成,ioloop需要下一個預定功能 - 這有點過於簡化了。
當然,這僅僅是例子,並且可以單獨yields
改變:
@gen.coroutine
def main():
print('main start %s' % test_var)
yield set_test_var()
yield clear_test_var()
你是對的,對不起,我沒有描述我的問題。 –
- 1. 龍捲風 - 龍捲風中的'全局變量'?
- 2. Python龍捲風全局變量
- 3. 龍捲風局部變量範圍(python)
- 4. 處理程序在龍捲風中生成全局變量
- 5. Python龍捲風:這是安全的嗎?
- 6. javascript全局變量 - 保護
- 7. 龍捲風協程需要幫助
- 8. 龍捲風 - 從URL中獲取變量
- 9. Fortran中受保護的全局變量
- 10. 龍捲風set_secure_cookie
- 11. 龍捲風IOLoop
- 12. 與龍捲風
- 13. 在龍捲風
- 14. 與龍捲風
- 15. 龍捲風request.body
- 16. 龍捲風locale.translate
- 17. 如何保護我的龍捲風python文件?
- 18. 刪除龍捲風中的安全Cookie
- 19. 變色龍模板全局變量
- 20. 無法檢索龍捲風安全cookie
- 21. 什麼是龍捲風ioloop和龍捲風的工作流程?
- 22. 龍捲風和ZeroMQ
- 23. 龍捲風和PostgreSQL
- 24. 龍捲風調度
- 25. 龍捲風websocket ping
- 26. 龍捲風和WTForms
- 27. 龍捲風和Django
- 28. 龍捲風IFRAME SRC
- 29. 使用龍捲風
- 30. 龍捲風認證
請添加您的代碼和相關信息。請參閱提問的教程http://stackoverflow.com/help/how-to-ask – SkyWalker