在另一个进程将一行写入文件之前,我应该如何阻止一个进程?

时间:2014-10-28 12:47:33

标签: python-2.7 subprocess

我有一个进程(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)

2 个答案:

答案 0 :(得分:1)

要等到子进程将一行写入其stdout并将child的stdout保存到文件中:

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()

答案 1 :(得分:0)

我认为您需要的是流程同步机制。您可以使用多个基元来实现相同的基元。例如,Lock用于锁定资源,以便其他进程在一个进程使用时无法访问它。同样,Mutex和信号量也可以达到同样的目的。

我为您提供了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个进程。这里,主进程将锁(由它创建)传递给每个进程,因此每个进程都获得相同的锁。现在,每个进程都会在执行实际任务之前尝试获取锁定。因为它是相同的锁(在进程之间共享),所以只有一个进程能够一次获取一个锁,因此其他进程将等到第一个进程释放锁。

如果你的两个进程没有从主进程分叉(比如两个独立分叉的独立进程),那么你需要实现全局共享内存或全局互斥或全局信号量。