国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

eventlet 之 monkeypatch 帶來的若干兼容性問題實例分析

ivydom / 2149人閱讀

摘要:概述最近需要在一個基于的服務中集成遇到了一個帶來的兼容性問題測試代碼如下當對模塊之后進程卡在了只有按中斷該線程之后程序才繼續運行但如果不對進行線程之后程序繼續運行這是為什么呢分析使用進行調試分為兩種情況對進行程序在之后切換到運行似乎就切換不

概述

最近需要在一個基于nameko/eventlet的服務中集成grpc client, 遇到了一個monkeypatch帶來的兼容性問題, 測試代碼如下:

import eventlet

eventlet.monkey_patch(thread=True)

import threading

from grpc._cython import cygrpc


class TestThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        completion_queue = cygrpc.CompletionQueue()
        while True:
            _ = completion_queue.poll()


threading._VERBOSE = True
t = TestThread()
t.start()

print("if thread is not patched, this message will be printed")

當對thread模塊patch之后, 進程卡在了t.start(), 只有按ctrl+c中斷該線程之后, 程序才繼續運行. 但如果不對thread進行patch, 線程start之后, 程序繼續運行. 這是為什么呢?

分析

使用pdb進行調試, 分為兩種情況:

1. 對thread進行patch


程序在switch之后切換到TestThread運行, 似乎就切換不回到主線程了!按下ctrl+c后TestThread才中斷, 并在主線程繼續運行.

2. 不對thread進行patch

在TestThread進入start之后, self.__started.wait()直接返回, 值得注意的是, 在start內部調用_start_new_thread就直接啟動子線程, 并且直接返回了!

結論

可見monkeypatch修改了threading標準庫中的_start_new_thread方法, Condition類等. 當patch之后,_start_new_thread方法并不直接啟動線程, 而是返回一個greenlet, 在這個問題當中, grpc調用的是一個c extension中的threading pool, monkeypatch無法對這個extension進行patch, 導致了后來switch到這個greenlet中時其實是進入到另一個線程中. 因為greenlet無法在不同的線程中切換, 導致程序無法從TestThread切回來, 只有主動去中斷TestThread, 才能被恢復.
自從遇到了這個問題, 以后做項目的并發模型就更加慎重了:). 如果不清楚monkeypatch到底做了些什么, 在選擇協程做python的底層并發模式時, 請三思.

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/41359.html

相關文章

  • 比較了Gruvi針對asyncio,gevent和eventlet一些設計決策和功能

    下表比較了Gruvi針對asyncio,gevent和eventlet的一些設計決策和功能。 * 特征 Gruvi Asyncio Gevent Eventlet IO library(依賴包) libuv stdlib libev stdlib /?libevent IO abstractionTransports/Protocols Transports/ProtocolsGre...

    ls0609 評論0 收藏0
  • 基于websocketcelery任務狀態監控

    摘要:目的曾經想向前臺實時返回任務的狀態監控,也查看了很多博客,但是好多也沒能如愿,因此基于網上已有的博客已經自己的嘗試,寫了一個小的,實現前臺實時獲取后臺傳輸的任務狀態。實現仿照其他例子實現了一個簡單的后臺任務監控。 1. 目的曾經想向前臺實時返回Celery任務的狀態監控,也查看了很多博客,但是好多也沒能如愿,因此基于網上已有的博客已經自己的嘗試,寫了一個小的demo,實現前臺實時獲取后...

    microelec 評論0 收藏0
  • 老生常談閉包(你不可不知若干知識點)

    摘要:閉包是什么這是一個在面試的過程中出現的概率為以上的問題,也是我們張口就來的問題。文章推薦我們面試中在被問到閉包這個問題是要注意的幾點閉包的延伸,讓面試變得 閉包是什么?這是一個在面試的過程中出現的概率為60%以上的問題,也是我們張口就來的問題。但是我們往往發現,在面試的過程中我們的回答并不那么讓面試官滿意,我們雖然能張口說出一些但是卻不能系統的對這個問題進行回答。面試官希望加入自己團隊...

    daydream 評論0 收藏0
  • 通過demo學習OpenStack開發所需基礎知識 -- API服務(2)

    摘要:這種表示具體的。中其他的關鍵字則是函數的參數,用于表示不同的前綴。這個是這個指定的第一個,作用是限制請求的大小。表示實現主要功能的應用,是一個標準的。對象是根據中的配置來處理的。最后會把請求交給進行處理。 本文會重點講解OpenStack中使用的API開發框架的使用。但是本文的目的并不是覆蓋這些框架的使用細節,而是通過說明重要的部分,降低初學者的入門的門檻。框架的使用細節都可以從文檔中...

    Martin91 評論0 收藏0
  • 通過demo學習OpenStack開發所需基礎知識 -- API服務(1)

    摘要:通過,也就是通過各個項目提供的來使用各個服務的功能。通過使用的方式是由各個服務自己實現的,比如負責計算的項目實現了計算相關的,負責認證的項目實現了認證和授權相關的。的服務都是使用的方式來部署的。 使用OpenStack服務的方式 OpenStack項目作為一個IaaS平臺,提供了三種使用方式: 通過Web界面,也就是通過Dashboard(面板)來使用平臺上的功能。 通過命令行,也就...

    Jason_Geng 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<