2010-11-06 18 views
5

Bu konuyla ilgili daha fazla veya daha az konuyla ilgili pek çok konu buldum ve hala tam bir cevap gibi neredeyse hiç bir şey yok ... Önerilerinizi arıyorum.Popen.communicate() yeterli olmadığında?

İşte, benim sorunum şu: Bir alt işlemle iki şekilde iletişim kurmam gerekiyor: Girişine çok fazla veri yazmam ve çıktılarını anında almam gerekiyor. Etrafında hiçbir yolu yoktur. Benim alt-işlem ünlü 'lame' mp3 encoder, giriş fonksiyonu tarafından oluşturulan bir saat ya da daha uzun PCM ses ve çıkış da kodlayıcı bitirmek için beklemeden chunk tarafından kullanıcı chunk gönderilmesi gereken mp3 dosyası.

Dokümanlara göre, Popen.communicate() IPC'yi düzinelerce veya yüzlerce megabayt olarak ölçülemem için bana yardımcı olmaz. Aynı zamanda, buradan öğrendiğim gibi, bu yaklaşımı bir sürü tuzak beklediğinden, bu yaklaşımı sıfırdan oluşturmaya çalışmak çok tehlikelidir: kilitlenme, tamponlama, süreç yönetimi, vb.

Yani, sorum şu: Bu tür bir problem için iyi bilinen bir çözüm var mı: python lib ya da problemi gerçekten çözen bir kod örneği? En azından, bunu kendi başlarına çözmeye çalışacak sorunların çoğunu açıkça belirten bir makale veya bir şey olabilir mi?

Teşekkür ederiz, Ilya.

cevap

2

En kolay yol, kendi programınızı ikiye ayırmaktır: LAME ve diğerine yazan ve diğerine yazılan ve kullanıcıya yazan diğer. Bu, çift yönlü iletişime sahip olmaktan çok daha kolaydır.

Bu sizin için işe yaramazsa, adlandırılmış yöneltmelerle geliştirme işlemini geleneksel boru IPC'den çok daha kolay buldum. Test sırasında çeşitli sıhhi tesisatların kullanılması kolaydır. Nonblocking I/O in Python 3, onlara daha kolay erişebilmeli.

+0

Fikrinizi alsam üç tane çocuk süreci başlatmam gerekiyor: biri giriş verisi oluşturmak ve onu yazgıya yazmak, bir tanesi topuzu kendi kendine çalıştırmak, diğeri de çıkışı almak ve kullanıcıya aktarmak. Burada beni korkutan şey, bütün denetleyici mantığı uygulamak zorunda kalacağım thougt: Çocukları beklemek, sinyalleri yakalamak ve ebeveyn çıkışında çocukları öldürmek ve tersine çevirmek vb. Vb. – izhak

+0

Python 3'te NB'ye gelince - teşekkür ederim, Onu okuyacağım. Maalesef bu özel görev, Python 2.4'ün hüzünlü bir gerçek olduğu, paylaşılan hosteslerin birkaçında koşmak zorunda. – izhak

+0

Üç çocuk, aklımda olan şeydi. Ama haklısın, hala uygulamak can sıkıcı. Sorunların en iyi şekilde tartışılması hala UNIX Ortamında İleri Düzey Programlamadır - bkz. Http://www.kohala.com/start/apue.html - bu konuda son derece tavsiye ederim. – max

İlgili konular