我有一个进程(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 :(得分: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个进程。这里,主进程将锁(由它创建)传递给每个进程,因此每个进程都获得相同的锁。现在,每个进程都会在执行实际任务之前尝试获取锁定。因为它是相同的锁(在进程之间共享),所以只有一个进程能够一次获取一个锁,因此其他进程将等到第一个进程释放锁。
如果你的两个进程没有从主进程分叉(比如两个独立分叉的独立进程),那么你需要实现全局共享内存或全局互斥或全局信号量。