İş parçacığı oluşturma, bir programın yürütme süresini önemli ölçüde azaltır. Python'da iş parçacığı oluşturmayı nasıl uygulayacağınızı öğrenin.

Yürütme süresi, bir programın etkinliğinin ortak ölçülerinden biridir. Yürütme süresi ne kadar hızlı olursa, program o kadar iyi olur. İş parçacığı oluşturma, bir programın aynı anda birden çok görevi veya işlemi gerçekleştirmesine izin veren bir tekniktir.

Yerleşik Python'u nasıl kullanacağınızı öğreneceksiniz. diş açma modül ve eşzamanlı özellikler modül. Bu modüllerin her ikisi de ileti dizileri oluşturmak ve yönetmek için basit yollar sunar

Diş Açmanın Önemi

İş parçacığı oluşturma, bir programın bir işi tamamlaması için gereken süreyi azaltır. İş birden fazla bağımsız görev içeriyorsa, görevleri aynı anda çalıştırmak için iş parçacığı oluşturmayı kullanabilir, böylece programın bir görevin bir sonrakine geçmeden önce bitmesi için bekleme süresini azaltabilirsiniz.

Örneğin, internetten birden fazla resim dosyası indiren bir program. Bu program, dosyaları birer birer indirmek yerine paralel olarak indirmek için iş parçacığını kullanabilir. Bu, programın bir sonraki dosyaya geçmeden önce bir dosyanın indirme işleminin tamamlanmasını beklemesi gereken süreyi ortadan kaldırır.

instagram viewer

İplik Takmadan Önce İlk Program

Aşağıdaki programdaki fonksiyon bir görevi temsil etmektedir. Görev, programın yürütülmesini bir saniye duraklatmak. Program, işlevi iki kez çağırır, dolayısıyla iki görev oluşturur. Ardından, tüm programın çalışması için geçen süreyi hesaplar ve ardından bunu ekranda görüntüler.

içe aktarmak zaman

start_time = time.perf_counter()

kesinlikleDuraklat():
Yazdır('Uyku 1 saniye...')
Uyku zamanı(1)
Yazdır('Uyku Bitti...')

Duraklat()
Duraklat()
bitiş_zamanı = süre.perf_counter()
Yazdır(f'Bitti {tur (finish_time - start_time, 2)} saniye (ler)')

Çıktı, programın yürütülmesinin 2.01 saniye sürdüğünü gösterir. Her görev bir saniye sürdü ve kodun geri kalanının yürütülmesi 0,01 saniye sürdü.

Her iki görevi aynı anda yürütmek için iş parçacığı kullanabilirsiniz. Bu, her iki görevi de yürütmek için bir saniye sürecektir.

Threading Modülünü Kullanarak Threading Uygulamak

İş parçacığı oluşturmayı uygulamak üzere ilk kodu değiştirmek için diş açma modül. İki iş parçacığı oluşturun, iplik_1 Ve iplik_2 kullanmak İplik sınıf. Ara başlangıç yürütülmesini başlatmak için her iş parçacığındaki yöntem. Ara katılmak programın geri kalanı yürütülmeden önce yürütmelerinin tamamlanmasını beklemek için her iş parçacığındaki yöntem.

içe aktarmak zaman
içe aktarmak diş açma
start_time = time.perf_counter()

kesinlikleDuraklat():
Yazdır('Uyku 1 saniye...')
Uyku zamanı(1)
Yazdır('Uyku Bitti...')

thread_1 = threading. Konu (hedef=duraklatma)
thread_2 = threading. Konu (hedef=duraklatma)

thread_1.start()
thread_2.start()

thread_1.join()
thread_2.join()

bitiş_zamanı = süre.perf_counter()
Yazdır(f'Bitti {tur (finish_time - start_time, 2)} saniye (ler)')

Program her iki iş parçacığını aynı anda çalıştıracaktır. Bu, her iki görevi yerine getirmek için gereken süreyi azaltacaktır.

Çıktı, aynı görevleri çalıştırmak için geçen sürenin yaklaşık bir saniye olduğunu gösterir. Bu, ilk programın aldığı sürenin yarısı kadardır.

concurrent.futures Modülünü Kullanarak İş Parçacığı Oluşturma

Python 3.2, eşzamanlı gelecekler modül. Bu modül, iş parçacıklarını kullanarak eşzamansız görevleri yürütmek için üst düzey bir arabirim sağlar. Görevleri paralel olarak yürütmenin daha basit bir yolunu sağlar.

İlk programı iş parçacığı kullanacak şekilde değiştirmek için concurrent.features modülünü içe aktarın. Kullan ThreadPoolYürütücü Bir iş parçacığı havuzu oluşturmak için concurrent.futures modülünden sınıf. Gönder Duraklat havuza iki kez işlev. bu göndermek yöntem bir döndürür gelecek işlev çağrısının sonucunu temsil eden nesne.

üzerinde yineleme vadeli işlemler kullanarak sonuçlarını yazdırın. sonuç yöntem.

içe aktarmak zaman
içe aktarmak eşzamanlı gelecekler

start_time = time.perf_counter()

kesinlikleDuraklat():
Yazdır('Uyku 1 saniye...')
Uyku zamanı(1)
geri dönmek'Uyku Bitti...'

ile eşzamanlı.gelecek. ThreadPoolExecutor() gibi yürütücü:
sonuçlar = [executor.submit (duraklat) için _ içinde menzil(2)]
için F içinde concurrent.futures.as_completed (sonuçlar):
yazdır (f.sonuç())

bitiş_zamanı = süre.perf_counter()

Yazdır(f'Bitti {tur (finish_time - start_time, 2)} saniye (ler)')

concurrent.features modülü, başlıkları başlatma ve birleştirme işlemlerini sizin için halleder. Bu, kodunuzu daha temiz hale getirir.

Çıktı, diş açma modülününkiyle aynıdır. İş parçacığı modülü, birkaç iş parçacığını paralel olarak çalıştırmanız gereken basit durumlar için kullanışlıdır. Öte yandan, concurrent.futures modülü, birçok görevi aynı anda yürütmeniz gereken daha karmaşık durumlar için kullanışlıdır.

Gerçek Dünya Senaryosunda İş Parçacığı Kullanma

Yukarıdaki programı çalıştırmak için iş parçacıklarını kullanmak, süreyi bir saniye kısalttı. Gerçek dünyada, ileti dizileri daha fazla zaman kazandırır. İnternetten resim indiren bir program oluşturun. La başlamak yeni bir sanal ortam yaratmak. yüklemek için terminalde aşağıdaki komutu çalıştırın. istekler kütüphane:

pip yükleme istekleri

İstek kitaplığı, HTTP istekleri göndermenize olanak tanır. İstek kitaplığını ve zaman kitaplığını içe aktarın.

içe aktarmak istekler
içe aktarmak zaman

İndirmek istediğiniz resimlerin URL'lerinin bir listesini oluşturun. Diş açmayı uyguladığınızda önemli bir fark görebilmeniz için en az on olmalarına izin verin.

img_urls = [
' https://images.unsplash.com/photo-1524429656589-6633a470097c',
' https://images.unsplash.com/photo-1530224264768-7ff8c1789d79',
' https://images.unsplash.com/photo-1564135624576-c5c88640f235',
' https://images.unsplash.com/photo-1541698444083-023c97d3f4b6',
' https://images.unsplash.com/photo-1522364723953-452d3431c267',
' https://images.unsplash.com/photo-1513938709626-033611b8cc03',
' https://images.unsplash.com/photo-1507143550189-fed454f93097',
' https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e',
' https://images.unsplash.com/photo-1504198453319-5ce911bafcde',
' https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99',
' https://images.unsplash.com/photo-1516972810927-80185027ca84',
' https://images.unsplash.com/photo-1550439062-609e1531270e',
]

Liste üzerinde döngü her görüntüyü projenizi içeren aynı klasöre indiren URL'lerin sayısı. Bitiş saatini başlangıç ​​zamanından çıkararak görüntülerin indirilmesi için geçen süreyi görüntüleyin.

start_time = time.perf_counter()
için img_url içinde img_urls:
img_bytes = request.get (img_url).content
img_adı = img_url.split('/')[3]
img_adı = F'{img_name}.jpg'
ile aç (img_name, 'wb') gibi img_file:
img_file.write (img_bytes)
Yazdır(F'{img_name} indirildi...')
bitiş_zamanı = süre.perf_counter()
Yazdır(f'Bitti {finish_time - start_time} saniye')

Programın 12 görüntüyü indirmesi yaklaşık 22 saniye sürer. Resimleri indirme süresi internet hızınıza da bağlı olduğu için size göre değişiklik gösterebilir.

Programı concurrent.features modülünü kullanarak iş parçacığı kullanacak şekilde değiştirin. Döngü yerine bir işlev kullanın. Bu, sisteme ileteceğiniz işlevdir. uygulayıcı misal.

içe aktarmak istekler
içe aktarmak zaman
içe aktarmak eşzamanlı gelecekler

img_urls = [
' https://images.unsplash.com/photo-1524429656589-6633a470097c',
' https://images.unsplash.com/photo-1530224264768-7ff8c1789d79',
' https://images.unsplash.com/photo-1564135624576-c5c88640f235',
' https://images.unsplash.com/photo-1541698444083-023c97d3f4b6',
' https://images.unsplash.com/photo-1522364723953-452d3431c267',
' https://images.unsplash.com/photo-1513938709626-033611b8cc03',
' https://images.unsplash.com/photo-1507143550189-fed454f93097',
' https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e',
' https://images.unsplash.com/photo-1504198453319-5ce911bafcde',
' https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99',
' https://images.unsplash.com/photo-1516972810927-80185027ca84',
' https://images.unsplash.com/photo-1550439062-609e1531270e',
]

start_time = time.perf_counter()

kesinlikleindir_resmi(img_url):
img_bytes = request.get (img_url).content
img_adı = img_url.split('/')[3]
img_adı = F'{img_name}.jpg'
ile aç (img_name, 'wb') gibi img_file:
img_file.write (img_bytes)
Yazdır(F'{img_name} indirildi...')

ile eşzamanlı.gelecek. ThreadPoolExecutor() gibi yürütücü:
yürütücü.map (indirme_resmi, img_urls)

bitiş_zamanı = süre.perf_counter()

Yazdır(f'Bitti {finish_time-start_time} saniye')

Diş açmayı tanıttıktan sonra. Zaman önemli ölçüde azalır. Programın yürütülmesini tamamlamak sadece 4 saniye sürdü.

Diş Açmaya Uygun Senaryolar

İş parçacığı oluşturmaya uygun senaryolardan bazıları şunlardır:

  • G/Ç bağlantılı görevler: Program, zamanın çoğunu girdi veya çıktı işlemlerinin tamamlanmasını bekleyerek harcıyorsa. İş parçacığı oluşturma, G/Ç işlemlerinin tamamlanmasını beklerken diğer görevlerin yürütülmesine izin vererek performansı artırabilir.
  • Web kazıma: Web kazıma, HTTP istekleri yapmayı ve HTML yanıtlarını ayrıştırmayı içerir. İş parçacığı oluşturma, aynı anda birden çok istekte bulunmanıza izin vererek işlemi hızlandırmaya yardımcı olur.
  • CPU'ya bağlı görevler: İş parçacığı oluşturma, birden çok görevin paralel olarak yürütülmesine izin vererek performansı artırmaya yardımcı olabilir.

Diğer Dillerde Dizi Yazma Konusunda Kendinizi Tanıyın

Python, iş parçacığını destekleyen tek dil değildir. Çoğu programlama dili bir tür iş parçacığını destekler. Diğer dillerdeki iş parçacıklarının uygulanmasına aşina olmanız önemlidir. Bu, sizi iş parçacığı oluşturmanın geçerli olabileceği farklı senaryoların üstesinden gelmek için gerekli becerilerle donatır.