Python'da Asenkron Programlama

Mar 06 2023
Eşzamansız programlama, birçok işlemin diğerine geçmeden önce birinin bitmesini beklemeden aynı anda ve bağımsız olarak çalışmasına izin veren bir programlama paradigmasıdır. Bu blog gönderisinde Python'da hangi asenkron programlamanın ve nasıl kullanılacağına bakacağız.
Python'da Asenkron Programlama

Eşzamansız programlama, birçok işlemin diğerine geçmeden önce birinin bitmesini beklemeden aynı anda ve bağımsız olarak çalışmasına izin veren bir programlama paradigmasıdır . Bu blog gönderisinde Python'da hangi asenkron programlamanın ve nasıl kullanılacağına bakacağız.

Asenkron Programlama nedir?

Eşzamanlı programlamada bilgisayar, talimatları sıralı bir düzende yürütür ve bir sonrakine geçmeden önce bir iş tamamlanana kadar yürütmeyi engeller.
Öte yandan eşzamansız programlama, programın bir işleme başlamasına ve ardından orijinal görev tamamlanana kadar yürütmeyi durdurmadan diğerine geçmesine izin verir.

Eşzamansız programlama, ağ G/Ç veya veritabanı işlemleri gibi işlemlerin tamamlanmasının uzun sürebileceği durumlarda özellikle yararlıdır. Eşzamansız programlama , yavaş bir işlemin tamamlanmasını beklerken programın diğer etkinliklere geçmesine izin vererek yazılım uygulamalarındaki performansı ve yanıt verme hızını artırmaya yardımcı olabilir .

Kullanılan programlama diline ve çerçevesine bağlı olarak, eşzamansız programlama, geri aramalar, vaatler veya async/await anahtar sözcükleri gibi çeşitli stratejiler kullanılarak gerçekleştirilebilir.

Asenkron Programlama ve Çoklu İşleme Arasındaki Farklar

Eşzamansız programlama ve çoklu işlem arasındaki temel fark, eşzamansız programlamanın bloke olmayan işlemlerin tek bir iş parçacığı içinde gerçekleşmesine izin vermesi, çoklu işlemenin ise işi aynı anda tamamlamak için birçok çekirdek veya işlem kullanmasıdır .

Eşzamansız Programlama ve İş Parçacığı Oluşturma Arasındaki Farklar

Eşzamansız programlama ile iş parçacığı oluşturma arasındaki temel fark, eşzamansız programlamanın tek bir iş parçacığı kullanarak engellemesiz işlemlere izin vermesi, iş parçacığı oluşturmanın ise birden çok görevi paralel olarak yapmak için birden çok iş parçacığı kullanmasıdır .

Farklılıklar hakkında daha fazla bilgi için: Treading vs Multiprocessing vs Asenkron Programlama

Asyncio nasıl kullanılır?

Öncelikle bir seferde bir iş yapmaya başlayan ve onları bitiren basit bir program yapalım.

import time
import asyncio

def do_job(s):
    print(f"{s} started")
    await asyncio.sleep(1)
    print(f"{s} done")

def main():
    start = time.perf_counter()
    todo = ["Job A", "Job B", "Job C"]
    for job in todo:
        do_job(job)
    
    end = time.perf_counter()
    print(f"Took: {end-start:.3f} seconds")

main()

# OUTPUT
# Job A started
# Job Adone
# Job B started
# Job B done
# Job C started
# Job C done
# Took: 3.009 seconds

Eşyordamlar Oluşturma ve Çalıştırma

Eşyordam, yürütme boyunca çeşitli zamanlarda kesintiye uğrayabilen ve devam ettirilebilen bir işlev türüdür. Başka bir deyişle, bir eşyordam, kesintiye uğrayabilecek bir kod yazmanıza, başka bir şey yapmanıza ve ardından kaldığı yerden devam etmenize olanak tanır.

Eşyordam oluşturmak için ,async anahtar kelimeden önce anahtar kelimeyi kullanmamız gerekir def. Bir eşyordamı çağırmak , çalıştırmak istediğimiz işlevi çağırmaz. Bir görev oluşturur.

import time
import asyncio

async def do_job(s):
  ...

async def main():
  ...

main()

asyncio.run(main())

bu kodu çalıştırırsanız, muhtemelen şöyle bir hata alırsınız:

RuntimeWarning: coroutine '...' was never awaited

import time
import asyncio

async def do_job(s):
    print(f"{s} started")
    await asyncio.sleep(1)
    print(f"{s} done")

async def main():
    start = time.perf_counter()
    todo = ["Job A", "Job B", "Job C"]
    for job in todo:
        await do_job(job)
    
    end = time.perf_counter()
    print(f"Took: {end-start:.3f} seconds")

asyncio.run(main())

# OUTPUT
# Job A started
# Job A done
# Job B started
# Job B done
# Job C started
# Job C done
# Took: 3.009 seconds

await asyncio.sleep(1)

tasks = [asyncio.create_task(do_job(item)) for item in todo]
done, pending = await asyncio.wait(tasks)

import time
import asyncio

async def do_job(s):
    print(f"{s} started")
    await asyncio.sleep(1)
    print(f"{s} done")

async def main():
    start = time.perf_counter()
    todo = ["Job A", "Job B", "Job C"]
    
    tasks = [asyncio.create_task(do_job(item)) for item in todo]
    done, pending = await asyncio.wait(tasks)
    
    end = time.perf_counter()
    print(f"Took: {end-start:.3f} seconds")

asyncio.run(main())

# OUTPUT
# Job A started
# Job B started
# Job C started
# Job A done
# Job B done
# Job C done
# Took: 1.009 seconds

Python'da eşzamansız programlama hakkında daha fazla bilgi almak için videoyu izleyebilirsiniz. ( Eşzamansız Python'a Giriş | Web Tarayıcısı Yazmak )