2013-04-22 75 views
1

我想運行兩個無限並行循環。一種是從服務器讀取數據並用數字更新對象。另一個沒有做任何事情,然後閱讀它,如果發生變化,處理它。不必同步或如此。所以我的問題是:運行兩個無限並行循環

  • 如果從一邊寫並從另一邊讀,Python是否有問題呢?
  • 如果我遇到同步問題,是否需要鎖定讀取/寫入過程?任何其他方式 我應該這樣做?
  • 什麼是最好的使用,線程或線程?
  • 作爲下一步,我將從100個站點讀取並更新100個對象, 並從100個循環讀取更改。是否建議使用 開始的多處理,這樣我可以無障礙地進行擴展?我是否需要閱讀和寫作問題?

任何幫助表示讚賞。

+0

您將使用Python的東西是不同的,這是對的嗎?我添加了Python語言標記。 – 2013-04-22 16:42:20

+0

如果可以將兩個任務合併到一個循環中,這比使用線程簡單得多。 – Aya 2013-04-22 17:03:38

+0

不,建議不要在一個循環中合併。雙方是完全異步的,所以一方面傾聽,另一方面進行處理。所以現在我有100個網站可以收聽,100個網站可以收聽。所有執行時間都不相同。 – 2013-04-22 17:55:59

回答

0

簡短的答案是,無論你認爲什麼都可以理解你。 意思是說,你的代碼對你的學習目的應該是有意義的。

下面是一個例子,它很輕便易用。從和線程 獲取價值是容易.. 它不是實際的多線程壽(相同的CPU核心)

from threading import * 

class worker(Thread): 
    def __init__(self, input=0): 
     self.input = input 
     Thread.__init__(self) 
     self.start() 

    def run(self): 
     while 1: 
      self.input += 1 

x = worker(-100) 
y = worker(x.input) 

print y.input 

這只是表明Y線程可以在x訪問數據的例子。 (總之:-100會計算每個週期兩次,-98,-96,-94 ..等)

  • 不會跨越多個CPU的
  • 簡單使用(跨線程訪問數據很容易)
  • 邏輯代碼,如果您不熟悉隊列系統或分佈式系統
  • 如果操作系統無法創建更多線程(「限制」),將引發錯誤
+0

「這不是真正的多線程tho」 - 但它是!限制說只有一次可以執行Python代碼。但是Python之外的所有調用都可能發生 – Kos 2013-04-22 16:56:23

+0

我所知道的是,假如這個代碼會創建異步代碼,它們可以以「並列」方式執行到彼此,但它不會跨越多個CPU,實際上並不會創建多重處理硬件意義上的應用程序但你將能夠運行軟件(os)-multithreaded codeblocks :)它的工作原理,底線:) – Torxed 2013-04-22 17:04:03

+0

'multiprocessing'模塊使用OS進程,而'threading'使用操作系統線程。兩者都可以利用多核機器(除非你使用'threading'並且全局解釋器鎖來了)。 – Kos 2013-04-22 17:13:14

0
from threading import Thread 
from Queue import Queue 

class producer(Thread): 
    def __init__(self,queue): 
     Thread.__init__(self) 
     self.queue=queue 
     self.start() 
    def run(self): 
     while 1: 
      self.queue.put(update_value()) 

class consumer(Thread): 
    def __init__(self,queue): 
     Thread.__init__(self) 
     self.queue=queue 
     self.start() 
    def run(self): 
     while True: 
      value = queue.get() 
      do_whatever_you_want(value) 
queue = Queue() 
producer(queue) 
consumer(queue) 

通知,您可以通過使用100生產者和一個消費規模(當然還有一個隊列),100個線程應該沒問題,但如果你想10000

+0

非常感謝,我會做一些測試。概念是,一方正在監聽100臺服務器,獲取數據並更新相關對象。另一方正在循環讀取和處理數據。當處理器運行在90%時,我仍然不確定多處理器是否更好?有什麼建議?當更新和readin同時發生時系統如何反應,是否崩潰?這是我最關心的問題。 – 2013-04-22 17:37:43

+0

如果你有多核,並且多處理更好,如果進程是CPU綁定的,隊列的使用情況類似,請參閱http://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes下有鎖所以保證閱讀和寫作不會同時發生,如果過程繁重,在消費者方面你可以有幾個進程消耗相同的隊列 – 2013-04-22 18:12:37