2 py kodunu aynı anda çalıstırma nasıl yapılır?

Ses tanıma ve yüz tanıma kodunu bir py dosyasında; motor hareket, yüz takibi ve kamera çalıstırma kodunu bir py dosyasında hazırladım. subprocess ile terminalden çalısan bir kod buldum ama iki kodu aynı anda elle tek tek çalıstırdığımda cpu %65-70 iken bu sekilde %90’lara yükseliyor. 2 py olarak ayırmamın sebebi ise daha önceden thread ve multi thread denemelerim oldu. Aynı anda çalıstı fakat bir süre sonra mikrofon dinlemeyi bırakıyor kamera döngüsü bir daha dinleme döngüsüne geri dönmüyor.

İki py dosyasını aynı anda senktorinize bir sekilde çalıstırmak ve islemcinin çekirdeklerini kullanabileceğim bir kod örneği yada linki paylasabilir misiniz? Veya bu konuda tavsiyeleriniz varsa yardımcı olursanız sevinirim.

Iki kod elle calistirildiginda toplam %70 CPU kullanirken kodla calistirildiginda toplam %90 CPU kullaniyorsa calistiran kod %20 CPU yiyor demektir. Onu duzeltmek isteyebilirsin.

CPU kullanimini toplam olarak degil de process basina olcmek de isteyebilirsin.

Ayni anda calistiran kod yok mu zaten? Senkronize calistirmak icin ise hangi noktalarin nasil senkronize olmalarini istedigini belirtmen lazim.


Ustu kapali bir problem icin genel cozum tavsiyeleri istemissin. Seni duckduckgo’ya yonlendiriyorum; orada binlerce tavsiye bulabilirsin. (“Siz genel olarak akliniza gelen her seyi yazin, ben spesifik problemim icin tek tek deneyeyim” dogru bir sorun cozme yontemi degil; butun interneti tek bir forum thread’ine tasimaya gerek yok.)

Kodlari gormeden soyleyebilecegim tek sey su: Multi-processing dogru, Multi-threading yanlis yaklasim.

2 Beğeni

Teşekkürler bilgiler için. İnternetteki çoğu multiprocessing ve Multi-threading kodlarını denedim. Aynı anda paralel çalışıp, sonra tek başına çalışıyor. Söylediğim gibi paralel çalıstı fakat bir süre sonra mikrofon dinlemeyi bırakıyor kamera döngüsü çalışıyor ve bir daha dinleme döngüsüne izin vermiyor. En son denediğim kodlar aşağıdaki sayfalardaki kodlardır. Yani kamera opencv kodları bir döngü ise diğer döngülerde birlikte çalışması gerekiyor ki robot işlev görsün.


Benim 2 py dosyasını eşit zamanlı hatta 3 py dosyasını çalıştırabildiğim kod ise bu şekilde :
( Bu kodda 4 çekirdeği kullanma, pool gibi ayarlar yok, shell’den çalışıyor )

import subprocess

path = r"/home/pi/Desktop/Robot/"
tasks = ['konusma.py', 'kamera.py']
task_processes = [
    subprocess.Popen(r'python3 %s\%s' % (path, task), shell=True)
    for task
    in tasks
]
for task in task_processes:
    task.wait()

Bu kodun dahada verimli çalışmasını sağlamanın , iyileştirmenin yolunu bulmalıyım. Verdiğiniz linktende bakacağım artık teşekkürler.

Multiprocessingde böyle bir problem yaşamamanız lazım diye düşünüyorum. İstiyorsanız kodları paylaşın inceleyelim. Bir de kodlarınızı bu linke göre düzenleyin.

Multiprocessing’te birde start ile çalıstırdığımda sanki kösedeki çarpı isaretine basmıs gibi programı kapatmak istiyor musunuz diye soru geliyor. Bende yerine run denemistim.
Aslında kamera ile birlikte normal bir while döngüsünde sıkıntı olmuyor ama ses ve kamera’da bu sıkıntı oldu. Kodlar raspberry pi’de olduğu için pc’ye aktardığımda paylasırım sizinle tesekkür ederim.

Raspberrypi ile ben de aynı şekilde sorunlar yaşamıştım. Çözümü bir fan ekleyerek buldum. Sanırım işlemi sonlandırmıyor ama sıcaklıktan dolayı da doğru bir şekilde çalıştıramıyor.

Böyle bir soru var ama çözümü henüz yok

Öyle mi ilginç sağol bende öyle bir deneyeyim. Bende de fan yok. Hiç aklıma gelmemisti.

Aynen bende bu sayfaya denk gelmistim. run ile en azından kapatmasını önledim ama geçerli bir islem olmadı. O yüzden simdilik paylastığım subprocess ile py dosyasını çalıstırma yöntemini kullanacağım. 4 çekirdek çalıstırma yöntemini arastırmam gerekiyor biraz.

Siz o sıkıntıya sadece IDE kullanırken rastlamıyor musunuz? Terminalden çalıştırın kodunuzu.

Asağıdaki sitede kodun isleyis sekli yazıyor. Aslında birde problem bu isleyis seklinde. önce 1 ve 2 çalısıyor sonra üst üste 1 ve sonra 2. belkide bu yüzden ses bir süre sonra çalısmayı bırakıyordur. Daha çok is parçacıklarını bitirmek için yazılmıs kodlar sanki.

https://www.tutorialspoint.com/python/python_multithreading.htm

¨¨python

Starting Thread-1
Starting Thread-2
Exiting Main Thread
Thread-1: Thu Mar 21 09:10:03 2013
Thread-1: Thu Mar 21 09:10:04 2013
Thread-2: Thu Mar 21 09:10:04 2013
Thread-1: Thu Mar 21 09:10:05 2013
Thread-1: Thu Mar 21 09:10:06 2013
Thread-2: Thu Mar 21 09:10:06 2013
Thread-1: Thu Mar 21 09:10:07 2013
Exiting Thread-1
Thread-2: Thu Mar 21 09:10:08 2013
Thread-2: Thu Mar 21 09:10:10 2013
Thread-2: Thu Mar 21 09:10:12 2013
Exiting Thread-2

¨¨

Verdiğiniz linkdeki kodlar python2 için, güncel bir tutorial bulsanız daha iyi olur.

Burada tam olarak ne demek istediniz?

Yani kamera veya mikrofon gibi öğelerin döngülerini değil, döngülerde uzun süren isleri hesaplamak, zamanı kısaltmak içindir multithread belkide demek istedim. Mesela yüz tanıma kodumda öncesinde yüklenen resimler var 10 resmi yüklemesi uzun sürüyor. Bunu 2 ayrı multithread’e ayırsam çok daha hızlı yükleme yapabilir.

Multithreading ile multiprocessing’i karıştırıyorsunuz. Yeni threadlar başlatmak performans kazancı sağlamaz.

Yani simdi örnek olarak 2’deki örneğe denk geldim. Çalısma yöntemini göstermek için paylastım. Arastıracağım. Aynen yeni ihtiyacım oldu ve fazla bilgim yok. Tesekkürler . Multiprocess’i doğru dürüst deneyemediğim için aradaki farkı bilmiyorum henüz. Multithreading’i denedim. Multiprocess ve subprocess konularını biraz arastırmam ve tecrübe edinmem gerekiyor.

https://docs.python.org/3/library/threading.html
https://docs.python.org/3/library/multiprocessing.html
https://docs.python.org/3/library/subprocess.html

1 Beğeni

Ssh ile bağlanıp masaüstünü kapatmak da yükü hafifletebilir.

Daha önceden kapanma olan kod güncel yazdığım kod ile kapanma yapmadı. Asağıdaki kod son halidir.
Yukarıda baska kodlarda var ama onları ekleyip kafa karıstırmaya gerek yok.
Simdi olan durumu anlatayım hangisini t1 yaparsam o baslıyor sürekli çalısıyor. Hatta yüz takibi ile motorlarda dönüyor. Fakat dinle() fonksiyonuna hiç geçmiyor. Eğer dinleyi t1 yaparsam o baslıyor kamera baslamıyor.

kodun son hali:
https://paste.ubuntu.com/p/jprXpwmKBP/

¨¨python ile kod paylasma çalısmadı paste ile yapıstırdım

Ssh ile çalısmayı hiç denemedim vnc ile çalısıyordum bi bakarım tesekkürler.

Kodunuzu yanlış yazmışsınız da ondan :smiley: . Bir dahakine kodunuzu en başta atarsanız daha hızlı çözüm üretiriz.

if __name__ == "__main__": 
    t1 = multiprocessing.Process(target=cam(panServo,tiltServo))
    t2 = multiprocessing.Process(target=dinle("komut"))
    t1.start() 
    t2.start()

Kısmı şöyle yazılmalı:

if __name__ == "__main__": 
    t1 = multiprocessing.Process(target=cam, args=(panServo,tiltServo))
    t2 = multiprocessing.Process(target=dinle, args=("komut",))
    t1.start() 
    t2.start()

target=cam(panServo,tiltServo) gibi bir kullanımda cam foksiyonu çalıştırılır ve geri dönen değer target parametresi olur. Bu yüzden ne yeni bir process başlatmış oluyorsunuz ne de kod t2 = multiprocessing.Process(target=dinle, args=("komut",)) kısmına geçilebiliyor.


``` yazmanız lazım, CTRL+ALT+ , bende çalışıyor. Olmadı şunu da kullanabilirsiniz:

[code]
print(“Hi”)
[/code]