Python’da Çoklu İşlemi Anlamak: Basitleştirilmiş Bir Kılavuz
Yoğun kaynak gerektiren uygulamalar veya veri işleme görevleri mi yürütüyorsunuz? AlexHost’un Özel Sunucuları, Python’da çoklu işlemin gücünden yararlanmak için mükemmel bir ortam sağlar. Yüksek performanslı CPU’lar, özel kaynaklar ve sağlam altyapı ile AlexHost, uygulamalarınızın ağır hesaplama yükleri altında bile verimli çalışmasını sağlar. İster veri topluyor, ister simülasyonlar çalıştırıyor veya makine öğrenimi modelleri kullanıyor olun, AlexHost’un çözümleri üretkenliğinizi en üst düzeye çıkarmak için özel olarak tasarlanmıştır.
Python’un çoklu işlem modülü, birden fazla işlemi eşzamanlı olarak çalıştırmanıza olanak tanıyarak birden fazla CPU çekirdeğini kullanmayı ve CPU’ya bağlı görevlerin performansını artırmayı mümkün kılar. Bu, özellikle veri işleme, makine öğrenimi veya simülasyonlar gibi hesaplama açısından yoğun görevleriniz olduğunda kullanışlıdır. Bu kılavuz, Python’da çoklu işlemenin nasıl çalıştığı ve nasıl etkili bir şekilde kullanılacağı hakkında basitleştirilmiş bir açıklama sağlar.
Neden Çoklu İşlem Kullanılmalı?
Python, aynı anda yalnızca bir iş parçacığının Python bayt kodunu yürütmesine izin veren bir Global Yorumlayıcı Kilidi (GIL) kullanır. Bu, çok çekirdekli bir işlemcide bile aynı anda yalnızca bir iş parçacığı çalışabileceğinden, CPU’ya bağlı görevler için çoklu iş parçacığı kullanmayı zorlaştırır. Öte yandan çoklu işlem, her işlem için ayrı bellek alanları oluşturarak her işlemin paralel olarak yürütülmesine ve birden fazla CPU çekirdeğinden tam olarak yararlanmasına olanak tanır.
Çoklu İşlem ve Çoklu İş Parçacığı Arasındaki Temel Farklar:
- Çoklu işlem: GIL’i atlayarak ve gerçek paralelliğe izin vererek her işlem için ayrı bellek alanları kullanır.
- Multithreading: İş parçacıkları arasında bellek alanını paylaşır, ancak Python’daki GIL ile sınırlıdır, bu da onu G / Ç’ye bağlı görevler (dosya okuma / yazma veya ağ istekleri gibi) için daha uygun hale getirir.
Çoklu İşlem Modülü ile Başlarken
Python’un çoklu işlem modülü, birden fazla işlem oluşturmak ve yönetmek için çeşitli yollar sağlar. Aşağıda bazı temel kavramlar ve bunların nasıl kullanılacağı yer almaktadır:
Modülü İçe Aktarma
Çoklu işlem kullanmak için modülü içe aktarın:
Çoklu İşlemin Temel Kavramları
- Süreç: Süreç, bir programın bağımsız bir örneğidir. Python bağlamında, her sürecin kendi bellek alanı vardır.
- Havuz: Havuz, sabit sayıda çalışan süreçle birden fazla süreci yönetmenize olanak tanır.
- Kuyruk: Kuyruk, süreçler arasındaki iletişim için kullanılır.
- Kilit: Kilit, işlemlerin paylaşılan kaynaklara aynı anda erişmesini önlemek için kullanılır.
Örnek 1: Basit Bir Süreç Oluşturma
Bir süreç oluşturmanın en temel yolu Process sınıfını kullanmaktır. İşte basit bir örnek:
from multiprocessing import Süreç
def print_numbers():
for i in range(5):
print(f "Sayı: {i}")
if __name__ == "__main__":
# Bir Süreç Oluşturun
process = Process(target=print_numbers)
# Süreci Başlatın
process.start()
# İşlemin tamamlanmasını bekleyin
process.join()
print("İşlem tamamlandı.")
- Süreç: Process sınıfı yeni bir süreç oluşturmak için kullanılır.
- target: Target bağımsız değişkeni, sürecin çalıştırması gereken işlevi belirtir.
- start(): Süreci başlatır.
- join(): Kodun geri kalanıyla devam etmeden önce işlemin tamamlanmasını bekler.
Bu örnekte, print_numbers işlevi ayrı bir süreçte çalışacak ve ana programın eşzamanlı olarak çalışmasına izin verecektir.
Örnek 2: Multiprocessing.Pool kullanımı
Pool sınıfı, çalışan süreçlerden oluşan bir havuzu yönetmek ve bir işlevi paralel olarak birden fazla veri öğesine uygulamak istediğinizde kullanışlıdır. İşte bir örnek:
from multiprocessing import Havuz
def kare_sayı(n):
n * n döndür
if __name__ == "__main__":
# 4 süreçli bir Havuz oluştur
pool(4) ile havuz olarak:
numbers = [1, 2, 3, 4, 5]
# İşlevi listedeki her öğeye uygulamak için pool.map() işlevini kullanın
sonuçlar = pool.map(kare_sayı, sayılar)
print(f “Karesi alınmış sayılar: {sonuçlar}”)
- Havuz: Çalışan süreçlerden oluşan bir havuz oluşturur. Bu durumda, 4 süreç oluşturur.
- map(): Map fonksiyonu bir fonksiyon ve bir iterable (liste gibi) alır ve fonksiyonu her bir elemana paralel olarak uygular.
Bu örnek, sayılar listesindeki her sayıyı 4 paralel işlem kullanarak kareler. Pool.map() işlevi, işi mevcut işlemler arasında böler ve sonuçları bir liste olarak döndürür.
Örnek 3: İşlemler Arası İletişim için Kuyruk Kullanımı
İşlemlerin iletişim kurması veya veri paylaşması gerekiyorsa, bir Kuyruk kullanabilirsiniz. Bu, özellikle bir üretici-tüketici senaryosuna sahip olduğunuzda kullanışlıdır.
from multiprocessing import Process, Queue
def producer(queue):
for i in range(5):
queue.put(i)
print(f "Üretildi: {i}")
def consumer(queue):
while not queue.empty():
item = queue.get()
print(f "Tüketildi: {öğe}")
if __name__ == "__main__":<
queue = Queue()
# Üretici ve tüketici süreçleri oluşturun
producer_process = Process(target=producer, args=(queue,))
consumer_process = Process(target=consumer, args=(queue,))
# Her iki işlemi de başlatın
producer_process.start()
consumer_process.start()
# Her iki işlemin de bitmesini bekleyin
producer_process.join()
consumer_process.join()
print(“Tüm öğeler işlendi.”)
- Kuyruk: Kuyruk, süreçler arasında veri aktarmak için kullanılır.
- put(): Kuyruğa bir öğe ekler.
- get(): Kuyruktan bir öğe alır.
Bu örnekte, üretici kuyruğa öğeler ekler, tüketici ise bu öğeleri alır ve işler.