2013-07-29 60 views
0

您好我正在使用bloomberg API(用於學習的目的,而不是太相關的問題 - 只是作爲上下文)。該過程的刪除(殺死)函數內部的一個python對象

部分是創建作爲查詢時做出響應的服務器發送「請求」。

每個查詢都保持「活動狀態」,直到對象被殺死。我正在使用一個函數來調用每個請求的數據,因爲這是我非常頻繁使用的代碼,每次調用請求的形狀都會發生相當大的變化。

def calldata(req): # doesnt currently work. Dont know why 
    session.sendRequest(req) 
    while True: 
     ev = session.nextEvent() 
     tmp = [] 
     if ev.eventType() == blpapi.Event.RESPONSE or blpapi.Event.PARTIAL_RESPONSE: 
      for msg in ev: 
       if msg.hasElement('securityData'): 
        data = msg.getElement('securityData') 
        tmp.append(data) 
     break 
    del req 
    return(tmp) 

其中REQ例如可以

# Data for clean multiple data ::= cleanref 
r = svc.createRequest('ReferenceDataRequest') 
r.append('securities','MSFT US Equity') 
r.append('fields','bid') 
cleanref = calldata(r) 


# Dirty reference for multiple data - both bad security and bad field 
# ::= errorref 
req = svc.createRequest("ReferenceDataRequest") 
req.append('securities','Rhubarb Curncy') 
req.append('fields','PX_LAST') 
req.append('securities','SGD Curncy') 
req.append('fields','desc') 
errorref= calldata(req) 

# Historical data request ::= histdata 
request = svc.createRequest("HistoricalDataRequest") 
request.getElement("securities").appendValue("IBM US Equity") 
request.getElement("securities").appendValue("MSFT US Equity") 
request.getElement("fields").appendValue("PX_LAST") 
request.getElement("fields").appendValue("OPEN") 
request.set("periodicityAdjustment", "ACTUAL") 
request.set("periodicitySelection", "MONTHLY") 
request.set("startDate", "20060101") 
request.set("endDate", "20061231") 
request.set("maxDataPoints", 100) 

histdata = calldata(request) 

# erroneous historical data request ::= histerr 
requ = svc.createRequest("HistoricalDataRequest") 
requ.getElement("securities").appendValue("IBM US Equity") 
requ.getElement("securities").appendValue("MSFT US Equity") 
requ.getElement("fields").appendValue("PX_LAST") 
requ.getElement("fields").appendValue("Desc") 
requ.set("periodicityAdjustment", "ACTUAL") 
requ.set("periodicitySelection", "MONTHLY") 
requ.set("startDate", "20060101") 
requ.set("endDate", "20061231") 
requ.set("maxDataPoints", 100) 

histerr = calldata(requ) 

所以我需要殺死對方在功能上的要求,以便能夠重新使用它,我不能弄明白。我懷疑這可能是與locals()有關,但任何幫助將感激地收到。

回答

2

你必須調用del rcalldata(r)每次通話後,像這樣:

cleanref = calldata(r) 
del r 

del ref自己的函數中僅刪除函數內部參考。

+0

謝謝@RomanPekar。這看起來像我必須採用的方法。 –

3

del不會刪除對象。它刪除名稱。所以,當你調用

del req 

所有你要做的是從本地命名空間中刪除名稱req

對象由garbage collector刪除。 req引用的對象將不會被刪除,直到引用該對象的所有名稱/變量都被刪除(並且即使它不能被刪除,這是一個實現問題)。在這種情況下,您可以在致電calldata(request)之後撥打del request。但是,即使那樣,也不能保證請求對象被刪除。

因此,我建議你改變你的代碼,以便它不依賴於對象是在特定的時間收集垃圾。我也不清楚如何,爲什麼,甚至是你的代碼是否真的依賴於此,或者你是否認爲它確實如此。

+0

嗨@LennartRegebro感謝您的迴應。 BBG幫助臺告訴我,它確實依賴於刪除對象。本來希望有一個簡單的方法來殺死/關閉它,但API不允許這樣做。 –

+1

@TahnoonPasha:如果他們讓Python程序員定義了Python API,那將會很不錯。 :rolleyes: –