2011-07-11 17 views
7

i aşağıdaki gibi bir yapısı vardır: Buradazincirleme POPEN subprocesses düzgün

os.mkfifo('pipe.tmp') 
enc = Popen(['encoder', '-i', 'pipe.tmp']) 
cap = Popen(['capture', '-f', 'pipe.tmp']) 

cap normalde (-f tarafından belirtilen) bir dosyaya yazan bir süreçtir, ama ekrana veri kusmak alabilirsiniz çıktı dosyası olarak /dev/stdout sağlayarak. benzer şekilde, enc dosya benzeri bir nesneden okunmasını bekler ve giriş olarak - sağlayarak boruyu okumayı başarabiliyorum. bunun yerine os bir adlandırılmış yöneltme kullanmak yerine, ben böyle isimsiz boru kullanabilirsiniz özel dosya gerekli olmayabilir düşünce ..

cap = Popen(['capture', '-f', '/dev/stdout'], stdout=PIPE) 
enc = Popen(['encoder', '-i', '-'], stdin=cap.stdout) 
cap.stdout.close() 

(ayrıca not yumurtlama düzeninin tersine). Bunu daha iyi seviyorum çünkü geçici bir dosya gereksiz görünüyor, ancak bu yapının süreçleri beklediğim şekilde zincirleyip zincirlemeyeceği konusunda biraz endişeliyim.

  1. OS fiili Stdout'a farklı konuşuyor /dev/stdoutcap bu? enc 'da - giriş borusuyla, diğer süreçler işletim sisteminde/dev/stdout'a uzaklaşsa bile, bu iki süreç arasında temiz bir veri kanalı alacağım?
  2. Engelleme/sıraya alma davranışlarında önemli farklılıklar olacak mı? İlk örneğimde, adlandırılmış borunun arabelleğe alınmış bir 4096 bayt olacağını ve cap/enc'un yeterince hızlı yazma/okuma yapmamanız halinde her iki uçta da bloke olacağını, ancak yanılıyorsam beni düzelteceğini düşünüyorum.
  3. herhangi bir özel yumurtlama veya terminasyon siparişi ya da bilmem gereken diğer herhangi bir toplama var mıdır? Bunu kullanmak sadece iyi olmalı, böylece

cevap

1
  1. /dev/stdout aktüel işlem için stdout'u verir. (/ dev/stdout hakkında gerçekten 'global' yoktur)
  2. İlk örnekteki fifo'nun boyutu, sisteminizin yapılandırmasına bağlıdır (bunu nasıl değiştireceğimi bilmiyorum). Ancak alt işlem.Popen, G/Ç işlemleri için arabellek boyutunu tanımlamanıza olanak tanır, böylece bunu ayarlayabilmeniz gerekir. Güncelleme: biraz daha fazla araştırmada, bufsize argümanından etkilenmeyen borulara 64kB sınır olduğunu tespit ettim. Bunun nasıl yapılacağından emin olun (daha sık okumak ve arabelleği el ile işlemek dışında)
  3. İkinci örneğiniz için, kap.stdout'un kullanılabilir olması gerektiğinden, verdiğiniz sırayla başlamanız gerekiyor gibi görünüyor. enc. başlamadan önce Alternatif olarak, iki sürecin bağlantısını kesebilir ve aralarındaki iletişimi elle kaldırabilirsiniz.