2015-11-26 55 views
0

語境:命名管道扭曲和MongoDB

我的最終目標是使一個可擴展的下載。我選擇了兩種腳本體系結構,因爲mongo在扭曲時不能很好地工作,所以我讓一個非扭曲的腳本執行數據庫讀寫操作,而另一個腳本扭曲一個腳本,執行處理操作,獲取儘可能多的數據第一個腳本。

我有一個包含url的集合的mongoDB數據庫。事情是這樣的:

record = {url:'www.somesite.com'} [PART OF SCRIPT 1] 

我有一個Python3(3.4.2)腳本,連接到數據庫,並通過命名管道飼料從數據庫到另一Python3腳本了多項紀錄。例如:

named_pipe = os.open('pipe_name', os.O_WRONLY) [PART OF SCRIPT 1] 
os.write(named_pipe, json.dumps(record)) [PART OF SCRIPT 1] 

在接收腳本上,我有一個函數receive(),它是由雙絞線調用的函數。類似這樣的:

reactor.callWhenRunning(receive) [PART OF SCRIPT 2] 

receive()函數試圖下載並保存url源碼。到現在爲止還挺好。雖然,我不確定一些事情。 這將是問題1

我收到我的這樣的網址。 問題2將與代碼這些行:

named_pipe = open('pipe_name', 'r') [PART OF SCRIPT 2] 
record = named_pipe.readline()[:-1] [PART OF SCRIPT 2] 

不是所有的源可以下載,所以,在遇到一個例外,我想送回去,到第一個腳本,看起來像一個記錄這樣的:

other_record = {'url':'www.somesite.com','downloaded':False} [PART OF SCRIPT 2] 

,或者如果它被下載,這樣的記錄:

other_record = {'url':'www.somesite.com','downloaded':True} [PART OF SCRIPT 2] 

爲此,我又命名管道:

other_named_pipe = os.open('other_pipe_name', os.O_WRONLY) [PART OF SCRIPT 2] 

此時,當我引入第二個命名管道時,我的腳本停止。調試器顯示停止在此行的腳本(或者第一個腳本中的等效行,即假設通過此管道接收記錄)。 這將是問題3.在第一個腳本等效線看起來是這樣的:

other_named_pipe = open('other_pipe_name', 'r') [PART OF SCRIPT 1] 
response_from_script_2 = other_named_pipe.readline()[:-1] [PART OF SCRIPT 1] 

所以,我的問題:

問題1:

難道一個管有意義的扭曲的上下文?爲了更好地使用twisted的異步模型,我是否應該有多個管道將輸入提供給第二個腳本?

問題2:

如果我改變的代碼,第一行中的腳本不工作:

named_pipe = os.open('pipe_name', os.O_RDONLY) 

或第二個到

record = named_pipe.readline() 

沒有什麼如果我進行第一次更改,並且如果我進行第二次更改,那麼打印該行不會顯示任何內容,並且json不再分析該字符串。爲什麼會發生?

問題3:

3.1。我可以在兩個腳本之間有多個命名管道嗎?

3.2。在扭曲的情況下通過管道進行溝通是否有效?

3.3。還有什麼其他的方法可以使兩個代幣進行溝通,尤其是那些在加捻反應器中運行的和另一種沒有的?

回答

1

首先,我認爲你的整個哲學是錯誤的。爲什麼你使用os.open()?在這之前你有沒有使用過os.mkfifo()?你有沒有在文件系統上創建命名管道?如果不是,它們只是普通文件。我不是100%確定的,爲什麼你的腳本停在只寫開放的位置,我需要做一點實驗來證實我的理論。我認爲你的pipe/fifo被阻塞,直到另一個進程開始讀取它。

如果你已經使用Twisted,爲什麼你關注像fifos/pipes這樣的原始IPC機制?有更好的消息傳遞機制,比這些甚至不保證你會收到你的信息一件。

StackOverflow充滿了關於'Twisted IPC'的答案,只是Google有點。

+0

我想你是正確的關於被阻塞的管道。我會檢查並確認。你會推薦什麼IPC? – RandomGuyqwert

+0

你說得對,我通過創建一個監聽器線程和一個發送器線程來解決這個問題。 – RandomGuyqwert

+0

我不是扭曲的傢伙,所以從我的經驗,我不能建議任何有關它。我通常不用Python編寫多進程的東西,主要是多線程,然後我使用隊列。 –