2015-07-21 43 views
0

我在做一個需要能夠處理大量命令的SocketServer。所以爲了防止我的RequestHandler過長,它會根據命令調用不同的函數。我的困境是如何讓信息發回給客戶。濫用產量

目前,我正在使功能「屈服」它想要發送回客戶端的所有內容。但我認爲這可能不是pythonic的方式。

# RequestHandler 
func = __commands__.get(command, unkown_command) 
for message in func(): 
    self.send(message) 


# example_func 
def example(): 
    yield 'ip: {}'.format(ip) 
    yield 'count: {}'.format(count) 

    . . . 

    for ping in pinger(ip,count): 
     yield ping 

這是對產量的醜惡使用嗎?我能想到的唯一的備選是,如果當RequestHandler調用該函數是通過自身作爲參數傳入

func(self) 

,然後在功能

def example(handler): 
    . . . 
    handler.send('ip: {}'.format(ip)) 

但這種方式並沒有感覺好多了。

+0

您也可以使用lambda。應該使測試更容易。 – Sorin

+0

@Sorin你的意思是這樣的:func(lambda x:self.send(x))? – Lufftre

+0

這兩種解決方案在技術上都是正確的,兩者都是同樣可測試的......第一個解決方案將處理函數完全解耦(如果沒有任何函數必須從處理程序中知道任何東西,這很好),第二個是最明顯的對於一個Python新手來說 - 這就是你如何使用沒有生成器的語言來做到這一點。 –

回答

1
def example(): 
    yield 'ip: {}'.format(ip) 
    yield 'count: {}'.format(count) 

什麼令我奇怪在這個解決方案不是利用yield本身(這可能是非常有效的),但你轉動你的數據轉換爲字符串過早地失去了大量的信息的事實。

特別是,對於這種數據,簡單地返回字典和處理在主叫方發送的,似乎更具可讀性:

def example(): 
    return {'ip': ip, 'count': count} 

這也有助於你分開的內容和表現,如果你這可能是有用的例如,想要返回以XML編碼的數據,但後來切換到JSON。

如果你想產生中間數據,另一種可能是使用元組:yield ('ip', ip)。通過這種方式,您可以保留原始數據,並可以立即開始處理函數外的值。

+0

我不想讓客戶等待迴應。一旦信息被檢索到,客戶端必須收到它。 – Lufftre

+0

@Lufftre然後你可以使用元組:'yield('ip',ip)'。但請注意,這會讓事情變得更加困難,除非獲得ip需要大量時間或數據非常大,否則可能會大大降低性能並且沒有明顯的優勢(請參閱[過早優化](http://stackoverflow.com)/questions/385506/when-is-optimization-premature)) – goncalopp

+0

對不起,我的例子很糟糕,但是有時需要花費很多時間才能獲得數據。我喜歡返回元組的想法,將研究這一點。 – Lufftre