2014-10-28 103 views
0

我有一個進程(agxp)接收數據並將它們寫入一個文件,另一個進程將數據發送到另一個進程。如何讓一個進程被阻塞,直到另一個進程將一行寫入文件?

當agxp啓動時,它應該立即產生一些輸出。我希望主進程阻塞,直到它看到文件中agxp的輸出的第一行。

我正在檢查第一行是否已通過比較文件的統計信息寫入文件,但它們始終是相同的。所以我被困在while循環中。爲什麼會發生?

 rvListen_AGX = "tibrvlisten -service " + agxService + " -network " + agxNetwork + " -daemon " + domain 

     agxf = open(self.AGX_logFileName, 'w') 
     agxstat = os.stat(self.AGX_logFileName) 
     agxp = subprocess.Popen(rvListen_AGX.split(), stdout = agxf, bufsize=0) 


     while os.stat(self.AGX_logFileName) == agxstat: 
      print agxstat 
      print os.stat(self.AGX_logFileName) 
      stxf.flush() 
      sleep(0.1) 
+0

您可以在主進程中設置'stdout = PIPE'並寫入'agxf'。 – jfs 2014-10-28 17:25:51

回答

1

等到子進程寫入一條線,它的標準輸出和孩子的標準輸出保存到一個文件:

import shutil 
from subprocess import Popen, PIPE 
from threading import Thread 

def copy_and_close(source, destination): 
    with source, destination: 
     shutil.copyfileobj(source, destination) 

agx_cmd = ("tibrvlisten -service {agxService} -network {agxNetwork} " 
      "-daemon {domain}".format(**vars())).split() 
agx_process = Popen(agx_cmd, stdout=PIPE, bufsize=1) 
agx_file = open(self.AGX_logFileName, 'wb') 
agx_file.write(agx_process.stdout.readline()) # block until a line is read 
Thread(target=copy_and_close, args=[agx_process.stdout, agx_file]).start() 
# do other things here.. 
rc = agx_process.wait() 

如果在agx_process運行,那麼你就不需要做其他的事情你可以調用代替主線程中的copy_and_close()

+0

我喜歡你的想法,但它並沒有真正回答我的問題。我在問爲什麼我的代碼被卡在while循環中,而不是如何解決問題。 – user1559897 2014-12-14 02:01:24

+0

@ user1559897:我已經回答了標題中的「如何」。 「while」循環的含義取決於平臺和文件系統設置,例如,「st_mtime」更新可能會延遲,直到文件緩存刷新。 – jfs 2014-12-15 21:24:47

0

我認爲你需要的是過程同步機制。有多個基元可以用來實現相同。例如,Lock用於鎖定資源,以便其他進程在被一個進程使用時無法訪問它。同樣,互斥和信號量也是爲了同樣的目的。

我提供了一個來自python doc的例子,它可以幫助你理解如何實現它。

from multiprocessing import Process, Lock 

def f(l, i): 
    l.acquire() 
    print 'hello world', i 
    l.release() 

if __name__ == '__main__': 
    lock = Lock() 

    for num in range(10): 
     Process(target=f, args=(lock, num)).start() 

在上面的例子中,你可以看到有一個郵件進程會創建另外10個進程。在這裏,主進程將鎖(由其創建)傳遞給每個進程,以便每個進程獲得相同的鎖。現在每個進程都會嘗試在執行實際任務之前獲取鎖定。因爲它是相同的鎖(在進程之間共享),所以只有一個進程能夠一次獲得鎖,所以其他進程將等待,直到第一個進程釋放該鎖。

如果你的兩個進程不是從主進程派生的(就像完全獨立分叉的兩個不同進程),那麼你需要實現全局共享內存或全局互斥或全局信號量。

+0

它是關於使用'multiprocessing'創建的子進程。它如何幫助OP的subprocess.Popen()創建的子進程? – jfs 2014-10-29 15:55:13

相關問題