Thrift python常見錯誤分析

2021-07-05 05:08:21 字數 3205 閱讀 5421

使用thrift經常碰到錯誤提示「no handlers could be found for logger "thrift.server.tserver"」,這句話其實很坑人,尤其是使用thrift的新手。因為,看到這句話也許會認為,應該是自己編寫的server程式框架有問題。也就是如下部分:

handler = xxfilterspamtextservicehandler()

processor = xxfilterspamtextservice.processor(handler)

transport = tsocket.tserversocket(port=9090)

tfactory = ttransport.tbufferedtransportfactory()

pfactory = tbinaryprotocol.tbinaryprotocolfactory()

server = tserver.t******server(processor, transport, tfactory, pfactory)

print "starting serve"

server.serve()

print "done!"

當然,有在這部分出錯的,也有在其他地方出錯的。下面我們詳細分析。

此類錯誤易犯人群:小白、程式剛剛寫完第一次除錯階段。這個錯誤解法相當簡單。比照模版看看出錯在那裡,官網模版位址程式**如下:

import sys, glob

sys.path.insert(0, glob.glob('../../lib/py/build/lib.*')[0])

from tutorial import calculator

from tutorial.ttypes import *

from shared.ttypes import sharedstruct

from thrift.transport import tsocket

from thrift.transport import ttransport

from thrift.protocol import tbinaryprotocol

from thrift.server import tserver

class calculatorhandler:

def __init__(self):

self.log = {}

def ping(self):

print 'ping()'

def add(self, n1, n2):

print 'add(%d,%d)' % (n1, n2)

return n1+n2

def calculate(self, logid, work):

print 'calculate(%d, %r)' % (logid, work)

if work.op == operation.add:

val = work.num1 + work.num2

elif work.op == operation.subtract:

val = work.num1 - work.num2

elif work.op == operation.multiply:

val = work.num1 * work.num2

elif work.op == operation.divide:

if work.num2 == 0:

x = invalidoperation()

x.what = work.op

x.why = 'cannot divide by 0'

raise x

val = work.num1 / work.num2

else:

x = invalidoperation()

x.what = work.op

x.why = 'invalid operation'

raise x

log = sharedstruct()

log.key = logid

log.value = '%d' % (val)

self.log[logid] = log

return val

def getstruct(self, key):

print 'getstruct(%d)' % (key)

return self.log[key]

def zip(self):

print 'zip()'

handler = calculatorhandler()

processor = calculator.processor(handler)

transport = tsocket.tserversocket(port=9090)

tfactory = ttransport.tbufferedtransportfactory()

pfactory = tbinaryprotocol.tbinaryprotocolfactory()

server = tserver.t******server(processor, transport, tfactory, pfactory)

# you could do one of these for a multithreaded server

#server = tserver.tthreadedserver(processor, transport, tfactory, pfactory)

#server = tserver.tthreadpoolserver(processor, transport, tfactory, pfactory)

print 'starting the server...'

server.serve()

print 'done.'

接下來,我們需要說的是:calculatorhandler,這個類名需要根據實際情況構造,比如這裡他們的名字thrift中的服務類的名字calculator,然後加上乙個handler就可以構造為服務類了,這種類我們統稱為handler類。

對於此,比較好的解決方案是:使用try....except  exception as e:模組來手動列印錯誤。try模組**示例如下:

try:

a=bexcept exception as e:

print e

這樣出錯時候,就會報出**出錯了!!!!

Fabric first sample常見錯誤

解決方案 清空容器 docker stop docker ps q docker rm docker ps aq 然後就變成新的問題2了 解決方案 這個問題產生的原因是之前產生的證書在docker裡面,沒有清乾淨 docker compose f docker compose cli.yaml do...

常見易錯問題

型別轉換 一 const cast 去除常量特性 二 static cast 普通型別轉換和類繼承的父指標到子類指標的轉換 引用一樣 注意 不能用於物件本身,只轉換不進行執行時型別檢查 不能進行的轉換 1 p int 2 aobj bobj 3 const non const 總的來說,沒有意義的轉...

常見錯誤和找錯方法

常見錯誤 總結 沒有效果就去找 排錯方式 1.根據知識點 2.根據業務邏輯來安排 2 1.明確瀏覽器解析的正確順序 1.標籤 2.css 3.js 2 2.頁面上啥也沒有,證明沒有標籤或者標籤位置寫錯 2 3.頁面上沒有樣式,證明選擇器沒有樣式 2 4.頁面上沒有動態互動,要麼沒有互動屬性,要麼互動...