Python Multiprocressing nasıl yapılır?

ayalkin

Hectopat
Katılım
6 Mayıs 2020
Mesajlar
171
Çözümler
1
Merhaba arkadaşlar. Python da aynı anda birden fazla çoklu işlem yaptırmak istiyorum işleri hızlandırmak adına. Hesaplamaların yapılması gereken bir parametre listesi oluşturup bunu bu procresslara dağıtıp (sırası önemli değil) işlem sonuçlarını .csv dosyasına kaydetmek istiyorum. Daha sonradan üstünde analiz yapabilmek amaçlı.

Sanırım şu şekilde bir yol izlemem lazım ama yardımcı olabilecek birileri var mı?
Python:
class ornek():
    def init(self):
        pass
   
    def task(self, girdi1, girdi2) -> list:
        # işlemlerin yapıldığı bölüm
       
        self.veri_yazici(csv_name=csv_name, veri_list=sonuclar, mode="a")
        return
   
    def multi_proces(self, num_proces:int=None, deger1:tuple=None, deger2:tuple=None, deger3:tuple=None):
       
        if __name__ == '__main__':
           
            open(file = csv_name, mode = "w").close()
            num_proces = int(num_proces) if num_proces and num_proces > 0 else 3

            self.items=[]

            # Parametreler arası hesaplamalar yapılıyor...
            for deger1 in range(deger1[0], deger1[1], deger1[2]):
                for deger2 in np.arange(deger2[0], deger2[1], deger2[2]):
                    deger2 = round(deger2, 1)
                    for deger3 in np.arange(deger3[0], deger3[1], deger3[2]):
                        deger3 = round(deger3, 1)
                       
                        self.items.append((deger1, deger2, deger3))

Yapmak istediğim şeye dair örnek bir şeyler yazdım. Örnek kodun içindeki multi_procres fonksiyonunda üretilen parametreleri items listesine kaydedip bu listenin içindeki elemanları her iş parçacığına dağıtmak istiyorum. Nasıl yapabilirim üstadlarım şimdiden teşekkürler.
 
Öncelikle, bir sınıf oluşturdum ve bu sınıf içinde işlerimizi gerçekleştireceğiz

import concurrent.futures
import csv
import numpy as np
class Ornek:
def init(self):
pass

def task(self, params) -> list:
girdi1, girdi2, csv_name = params
# işlemlerin yapıldığı bölüm
sonuclar = [girdi1, girdi2] # Bu kısmı kendi işlemlerinize göre güncelleyin
self.veri_yazici(csv_name=csv_name, veri_list=sonuclar, mode="a")
return sonuclar

def veri_yazici(self, csv_name, veri_list, mode):
with open(csv_name, mode, newline='') as file:
writer = csv.writer(file)
writer.writerow(veri_list)

def multi_process(self, num_proces: int = None, deger1: tuple = None, deger2: tuple = None, deger3: tuple = None):
csv_name = "sonuclar.csv"

if name == 'main':
open(file=csv_name, mode="w").close()
num_proces = int(num_proces) if num_proces and num_proces > 0 else 3

self.items = []

# Parametreler arası hesaplamalar yapılıyor...
for deger1_val in range(deger1[0], deger1[1], deger1[2]):
for deger2_val in np.arange(deger2[0], deger2[1], deger2[2]):
deger2_val = round(deger2_val, 1)
for deger3_val in np.arange(deger3[0], deger3[1], deger3[2]):
deger3_val = round(deger3_val, 1)

self.items.append((deger1_val, deger2_val, csv_name))

with concurrent.futures.ProcessPoolExecutor() as executor:
results = list(executor.map(self.task, self.items))

# Örnek kullanım
ornek_instance = Ornek()
ornek_instance.multi_process(num_proces=3, deger1=(1, 5, 1), deger2=(0.1, 1.0, 0.1), deger3=(0.5, 1.5, 0.5))




Bu örnekte, Python kullanarak bir sınıf oluşturdum ve bu sınıf içinde çoklu işlemleri başlatmak için gereken işlemleri yazdım. gorev fonksiyonunda yapman gereken işlemleri, yani senin işlemlerinizi ekleyeceksin. Parametreleri, sonuçları ve hatta CSV dosyasının adını istediğin gibi özelleştirebilirsin.
 
Örneğinizi anlamadım ama örnek bir multiprocessing kodu atabilirim ondan ilham alarak kendi örneğinize uyarlayabilirsiniz.

Python:
import multiprocessing
def write(d, f):
    with open(f, 'w') as file:
        file.write(d)

def work(a):
    write(a[1], f"k/{a[0]}.txt")
    # Çalıştıracağımız fonksiyon

if __name__ == "__main__":
    liste = list("sbfdkjlşkjgfhajkmsölşçiöldmkfaşdjnmkchbnajmsckdvnfbhacjnklxsadhasdnfjkaskcnasjdnfajncjasndfcjacsx")
    # Verilerimiz
    
    with multiprocessing.Pool(processes=3) as pool:
        pool.map(work, enumerate(liste))
    # Bir multi process havuzu açma
    print("İşlemler tamamlandı.")
 

Technopat Haberler

Geri
Yukarı