2016-01-08 81 views
3

我很抱歉,如果這不是正確的方式來說,但我不知道從哪裏開始。如果這個問題需要重新編寫,我肯定會這樣做。訪問正在運行的Python代碼

我剛寫完一段代碼,收集來自各種服務器的數據。它目前正在運行,我希望能夠開始編寫其他能夠訪問正在收集的數據的代碼。很明顯,我可以通過將數據轉儲到文件中,並讓我的數據分析代碼讀取存儲在磁盤上的文件。但是,對於某些形式的分析,我希望能夠更接近實時數據。有沒有一種方法可以讓我從我的數據收集代碼塊中訪問該類而不顯式實例化它?我的意思是,我可以設置一段代碼來啓動數據收集,然後再編寫其他代碼段,以便能夠訪問數據收集類而不停止並重新啓動數據收集代碼段?

我希望這是有道理的。我意識到數據可以存儲到磁盤,我可以做的事情就像我的數據分析代碼搜索目錄進行更改。但是,我只是想知道是否可以這樣做。

+0

你知道'阿帕奇Kafka' [教程](http://kafka-python.readthedocs.org/en/latest/usage.html) – python

+1

這似乎是一個'生產者Consumer'問題?看到這個例子[生產者消費者](http://agiliq.com/blog/2013/10/producer-consumer-problem-in-python/) – python

+0

這看起來沿着我想要做的事情。我沒有這樣想過,但我認爲這是正確的想法。我最初的想法是讓數據收集器連續運行,然後發送信號從數據收集器請求一定數量/類型的數據。 – FirstPrime

回答

3

這似乎是一個Producer Consumer問題。

生產者的工作是生成一段數據,將其放入 緩衝區並重新開始。與此同時,消費者一次一件地消費 數據(即從緩衝器中移除它)

這裏的捕捉是「同時」。所以,生產者和消費者需要 同時運行。因此,我們需要生產者和消費者的獨立線程。

我從上面的鏈接獲取代碼,您應該通過它來獲取額外的細節。

from threading import Thread 
import time 
import random 
from Queue import Queue 

queue = Queue(10) 

class ProducerThread(Thread): 
    def run(self): 
     nums = range(5) 
     global queue 
     while True: 
      num = random.choice(nums) 
      queue.put(num) 
      print "Produced", num 
      time.sleep(random.random()) 


class ConsumerThread(Thread): 
    def run(self): 
     global queue 
     while True: 
      num = queue.get() 
      queue.task_done() 
      print "Consumed", num 
      time.sleep(random.random()) 


ProducerThread().start() 
ConsumerThread().start() 

說明:

  • 我們使用一個Queue實例(此後隊列).Queue具有條件 和該條件下有其鎖。如果您使用隊列,則不需要打擾 條件和鎖定。

  • 生產者使用put在隊列中可用插入數據到隊列中。

  • put()具有在將數據插入 隊列之前獲取鎖定的邏輯。

  • 還put()檢查隊列是否已滿。如果是,那麼它在內部調用
    wait(),因此生產者開始等待。

  • 消費者使用得到。

  • get()在從隊列中刪除數據之前獲取鎖。

  • get()檢查隊列是否爲空。如果是的話,它會讓消費者進入 等待狀態。

+0

當我再次閱讀時,我想知道它是否真的回答我的問題。也許我是誤解。我必須停止並重新啓動數據收集線程,以便我的新數據分析線程可以訪問隊列嗎? – FirstPrime

+0

如果您需要特定的答案,那麼您需要先編寫自己的代碼,否則將會很困難。 – python

+0

我看不出代碼如何比這裏的描述更有用。我想開始一段Python代碼並讓它連續運行。在運行時,我想編寫另一段可以隨時啓動的Python代碼,並讓它訪問第一段代碼而不停止第一段代碼。 – FirstPrime