Döngü İçin Python Çoklu İşleme

Dongu Icin Python Coklu Isleme



Çoklu işleme, çoklu kullanımla karşılaştırılabilir. Bununla birlikte, iş parçacığı için kullanılan GIL nedeniyle bir anda yalnızca bir iş parçacığını çalıştırabilmemiz bakımından farklılık gösterir. Çoklu işleme, işlemleri birkaç CPU çekirdeğinde sırayla gerçekleştirme işlemidir. Mesaj dizileri paralel olarak çalıştırılamaz. Ancak çoklu işleme, süreçleri oluşturmamıza ve bunları çeşitli CPU çekirdeklerinde eşzamanlı olarak çalıştırmamıza olanak tanır. Döngü, for döngüsü gibi, en sık kullanılan betik dillerinden biridir. Aynı işi, önceden belirlenmiş bir yineleme sayısı gibi bir kritere ulaşılana kadar çeşitli verileri kullanarak tekrarlayın. Döngü, her yinelemeyi birer birer gerçekleştirir.

1. Örnek: Python Çoklu İşleme Modülünde For-Loop'u Kullanma

Bu örnekte for-loop ve Python çoklu işlem modülü sınıf sürecini kullanıyoruz. Python çok işlemli for-loop'un nasıl çalıştığını hızlı bir şekilde anlayabilmeniz için çok basit bir örnekle başlıyoruz. Çoklu işlem, iş parçacığı oluşturma modülüyle karşılaştırılabilir bir arabirim kullanarak, süreçlerin oluşturulmasını paketler.







Çok işlemli paket, iş parçacığı yerine alt işlemleri kullanarak hem yerel hem de uzak eşzamanlılık sağlar, böylece Global Tercüman Kilidinden kaçınır. Bir diziyi sürekli olarak yinelemek için bir dize nesnesi veya bir demet olabilen bir for döngüsü kullanın. Bu, diğer programlama dillerinde görülen anahtar kelimeden daha az ve diğer programlama dillerinde bulunan bir yineleme yöntemi gibi çalışır. Yeni bir çoklu işleme başlatarak, aynı anda bir yordamı yürüten bir for döngüsü çalıştırabilirsiniz.



'Spyder' aracını kullanarak kod yürütme kodunu uygulayarak başlayalım. 'Spyder'ın Python'u çalıştırmak için de en iyisi olduğuna inanıyoruz. Kodun çalıştığı çok işlemcili bir modül sürecini içe aktarıyoruz. Python konseptinde 'işlem sınıfı' olarak adlandırılan çoklu işlem, yeni bir Python işlemi oluşturur, ona kodu yürütmek için bir yöntem verir ve ana uygulamaya yürütmeyi yönetmesi için bir yol verir. Process sınıfı, her ikisi de çok önemli olan start() ve join() prosedürlerini içerir.



Ardından, 'func' adlı kullanıcı tanımlı bir işlev tanımlarız. Kullanıcı tanımlı bir fonksiyon olduğu için ona istediğimiz bir isim veriyoruz. Bu fonksiyonun gövdesi içerisinde “subject” değişkenini argüman olarak ve “matematik” değerini iletiyoruz. Ardından, 'Ortak öznenin adı' ifadesini ve değeri içeren 'konu' bağımsız değişkenini ileterek 'print()' işlevini çağırıyoruz. Ardından, bir sonraki adımda, dosya bir modül olarak içe aktarıldığında kodu çalıştırmanızı engelleyen ve yalnızca içerik bir komut dosyası olarak yürütüldüğünde bunu yapmanıza izin veren “if name== _main_” ifadesini kullanıyoruz.





Başladığınız koşul bölümü, çoğu durumda, yalnızca dosyanız bir komut dosyası olarak çalıştığında yürütülmesi gereken içeriği sağlayan bir konum olarak düşünülebilir. Ardından argüman konusunu kullanırız ve içinde “bilim”, “İngilizce” ve “bilgisayar” gibi bazı değerler depolarız. İşleme daha sonra aşağıdaki adımda 'işlem1[]' adı verilir. Ardından, süreçteki işlevi çağırmak için 'process(target=func)' kullanırız. Hedef fonksiyonu çağırmak için kullanılır ve bu işlemi “P” değişkenine kaydederiz.

Ardından, 'func' işlevinde sahip olduğumuz listenin sonuna bir öğe ekleyen 'append()' işlevini çağırmak için 'process1'i kullanırız. İşlem 'P' değişkeninde saklandığından, 'P'yi bu işleve argümanı olarak iletiyoruz. Son olarak, işlemi başlatmak için 'P' ile 'start()' işlevini kullanırız. Ardından “subject” argümanını sağlarken methodu tekrar çalıştırıyoruz ve konu içerisinde “for” kullanıyoruz. Ardından “process1” ve “add()” methodunu bir kez daha kullanarak işleme başlıyoruz. İşlem daha sonra çalışır ve çıktı döndürülür. Ardından “join()” tekniği kullanılarak işlemin bitirilmesi söylenir. “join()” prosedürünü çağırmayan proseslerden çıkılmayacaktır. Önemli bir nokta, süreç boyunca herhangi bir argüman sağlamak istiyorsanız 'args' anahtar kelime parametresinin kullanılması gerektiğidir.




Artık “process” fonksiyonunu kullanarak çağırdığımız için “func” fonksiyonuna geçtiğimiz “matematik” konusu için değeri ileterek ilk olarak ifadenin görüntülendiğini çıktıda görebilirsiniz. Ardından, listede zaten var olan ve sonunda eklenen değerlere sahip olmak için “append()” komutunu kullanırız. Daha sonra “bilim”, “bilgisayar” ve “İngilizce” konuları sunuldu. Ancak gördüğünüz gibi değerler doğru sırada değil. Bunun nedeni, prosedür biter bitmez bunu yapmaları ve mesajlarını bildirmeleridir.

Örnek 2: Sıralı For-Loop'un Çoklu İşleme Paralel For-Loop'a Dönüştürülmesi

Bu örnekte, çok işlemli döngü görevi, paralel bir for-loop görevine dönüştürülmeden önce sırayla yürütülür. For döngülerini kullanarak bir koleksiyon veya dize gibi diziler arasında oluştukları sırayla geçiş yapabilirsiniz.

Şimdi kodu uygulamaya başlayalım. İlk olarak time modülünden “sleep”i import ediyoruz. Zaman modülündeki “sleep()” prosedürünü kullanarak, çağıran iş parçacığının yürütülmesini istediğiniz kadar askıya alabilirsiniz. Daha sonra random modülünden “random” kullanıyoruz, “func” ismiyle bir fonksiyon tanımlıyoruz ve “argu” anahtar kelimesini geçiyoruz. Ardından “val” kullanarak rastgele bir değer oluşturuyoruz ve onu “random” olarak ayarlıyoruz. Daha sonra “sleep()” metodunu kullanarak kısa bir süre blok yapıp “val” parametresini geçiyoruz. Ardından, bir mesaj iletmek için, 'ready' kelimelerini ve 'arg' anahtar kelimesini parametre olarak ve ayrıca 'created' ve 'val' kullanarak değeri ileterek 'print()' yöntemini çalıştırıyoruz.

Son olarak, 'flush' kullanıyoruz ve 'True' olarak ayarlıyoruz. Kullanıcı, Python'un yazdırma işlevindeki floş seçeneğini kullanarak çıktının ara belleğe alınıp alınmayacağına karar verebilir. Bu parametrenin varsayılan False değeri, çıktının ara belleğe alınmayacağını belirtir. Doğru olarak ayarlarsanız, çıktı birbirini izleyen bir dizi satır olarak görüntülenir. Ardından, giriş noktalarını güvence altına almak için “if name== main” kullanırız. Ardından, işi sırayla yürütürüz. Burada aralığı “10” olarak ayarladık, bu da döngünün 10 iterasyondan sonra bittiği anlamına geliyor. Ardından, 'print()' işlevini çağırıyoruz, 'ready' giriş ifadesini iletiyoruz ve 'flush=True' seçeneğini kullanıyoruz.


Artık kodu çalıştırdığımızda döngünün fonksiyonun “10” kez çalışmasına neden olduğunu görebilirsiniz. Sıfır dizinden başlayıp dokuzuncu dizinde biten 10 kez yinelenir. Her mesaj, 'arg' olarak ilettiğimiz bir işlev numarası olan bir görev numarası ve bir oluşturma numarası içerir.


Bu sıralı döngü şimdi çok işlemcili bir paralel for döngüsüne dönüştürülüyor. Aynı kodu kullanıyoruz, ancak çoklu işlem için bazı ekstra kitaplıklara ve işlevlere gidiyoruz. Bu nedenle, işlemi daha önce açıkladığımız gibi multiprocessing'den içe aktarmalıyız. Ardından, rastgele bir sayı elde etmek için 'val=random' kullanmadan önce 'func' adında bir işlev oluşturuyoruz ve 'arg' anahtar kelimesini iletiyoruz.

Daha sonra “print()” metodunu çağırıp mesaj gösterip “val” parametresini biraz geciktirdikten sonra “if name= main” fonksiyonu ile giriş noktalarını güvenli hale getiriyoruz. Bunun üzerine bir process oluşturup süreç içindeki fonksiyonu “process” kullanarak çağırıyoruz ve “target=func” u geçiyoruz. Ardından “func”, “arg”, “m” değerini ve “10” aralığını geçiyoruz, yani döngü “10” yinelemeden sonra işlevi sonlandırıyor. Ardından “process” ile “start()” methodunu kullanarak işlemi başlatıyoruz. Ardından işlemin yürütülmesini beklemek ve ardından tüm işlemi tamamlamak için “join()” yöntemini çağırıyoruz.


Bu nedenle, kodu çalıştırdığımızda, işlevler ana işlemi çağırır ve yürütmeye başlar. Ancak, tüm görevler tamamlanana kadar yapılırlar. Bunu görebiliriz çünkü her görev aynı anda yürütülür. Mesajını biter bitmez bildirir. Bu, mesajların sıra dışı olmasına rağmen, tüm '10' yineleme tamamlandıktan sonra döngünün sona erdiği anlamına gelir.

Çözüm

Bu makalede Python çoklu işleme for döngüsü konusunu ele aldık. Ayrıca iki illüstrasyon da sunduk. İlk çizim, Python'un döngü çoklu işleme kitaplığında bir for döngüsünün nasıl kullanılacağını gösterir. İkinci resim, sıralı bir for döngüsünün paralel çoklu işleme for döngüsüne nasıl dönüştürüleceğini gösterir. Python çoklu işleme için betiği oluşturmadan önce, çoklu işleme modülünü içe aktarmalıyız.