鍍金池/ 問答/Python  Linux/ oslo.messaging消息接收機(jī)制

oslo.messaging消息接收機(jī)制

openstack社區(qū)上看到一個(gè)bug,和我目前遇到的問題一樣:
https://review.openstack.org/...
但是文中的解釋有些不理解:

  1. threading 和 eventlet executor是什么,為什么會(huì)有這兩種機(jī)制
  2. 下面這兩句話不太理解(不是英文不理解),希望高手能解答一下,不勝感激!
    With eventlet, we don't really share the socket between threads.
    But with threading executor and expecialy ssl, this can't work, if you
    write data with two different threads to the socket.
回答
編輯回答
尛曖昧
  1. threading和eventlet executor是兩種不同的異步執(zhí)行機(jī)制。threading是通過python的并發(fā)庫concurrent.futures模塊實(shí)現(xiàn)的。任務(wù)生產(chǎn)者負(fù)責(zé)產(chǎn)生任務(wù),并把任務(wù)加入到線程池,適當(dāng)?shù)臅r(shí)候這些任務(wù)會(huì)執(zhí)行,但是執(zhí)行順序并不一定會(huì)按照加入線程池的順序進(jìn)行。 eventlet 是python的網(wǎng)絡(luò)庫,通過協(xié)程的方式實(shí)現(xiàn)并發(fā)。
  2. 第一句話:一個(gè)協(xié)程擁有自己私有的stack和局部變量,但也和其他協(xié)程有共有的全局變量,但是在不同的協(xié)程之間并沒有公用socket。 第二句話:線程池中是不同的線程,如果使用不同的線程去向同一個(gè)socket寫數(shù)據(jù)的話,ssl安全檢查會(huì)有問題。

總結(jié)問題:我對這個(gè)問題的理解是:使用eventlet機(jī)制是沒有問題的,這個(gè)問題是由于使用了threading造成的。多個(gè)線程使用同一個(gè)socket去處理消息會(huì)造成混亂,就像多個(gè)線程同時(shí)打印信息到屏幕上在一行里就會(huì)出現(xiàn)信息錯(cuò)亂的情況一樣。

2017年9月3日 05:10