我的最終目標是使一個可擴展的下載。我選擇了兩種腳本體系結構,因爲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。還有什麼其他的方法可以使兩個代幣進行溝通,尤其是那些在加捻反應器中運行的和另一種沒有的?
我想你是正確的關於被阻塞的管道。我會檢查並確認。你會推薦什麼IPC? – RandomGuyqwert
你說得對,我通過創建一個監聽器線程和一個發送器線程來解決這個問題。 – RandomGuyqwert
我不是扭曲的傢伙,所以從我的經驗,我不能建議任何有關它。我通常不用Python編寫多進程的東西,主要是多線程,然後我使用隊列。 –