Olay Odaklı Programlama
Olay odaklı programlama olaylara odaklanır. Sonunda, programın akışı olaylara bağlıdır. Şimdiye kadar, sıralı veya paralel yürütme modeliyle uğraşıyorduk, ancak olay güdümlü programlama konseptine sahip modele asenkron model denir. Olay güdümlü programlama, her zaman yeni gelen olayları dinleyen bir olay döngüsüne bağlıdır. Olay güdümlü programlamanın çalışması olaylara bağlıdır. Bir olay bir kez döndüğünde, olaylar neyin hangi sırayla yürütüleceğine karar verir. Aşağıdaki akış şeması, bunun nasıl çalıştığını anlamanıza yardımcı olacaktır -
Python Modülü - Asyncio
Asyncio modülü Python 3.4'e eklenmiştir ve ortak rutinler kullanarak tek iş parçacıklı eşzamanlı kod yazmak için altyapı sağlar. Asyncio modülü tarafından kullanılan farklı kavramlar aşağıdadır -
Olay döngüsü
Olay döngüsü, bir hesaplama kodundaki tüm olayları işlemek için bir işlevdir. Tüm programın yürütülmesi sırasında yol boyunca hareket eder ve olayların gelen ve yürütülmesini takip eder. Asyncio modülü, işlem başına tek bir olay döngüsüne izin verir. Bir olay döngüsünü yönetmek için Asyncio modülü tarafından sağlanan bazı yöntemler aşağıdadır -
loop = get_event_loop() - Bu yöntem, geçerli bağlam için olay döngüsünü sağlayacaktır.
loop.call_later(time_delay,callback,argument) - Bu yöntem, verilen time_delay saniyeden sonra çağrılacak geri aramayı düzenler.
loop.call_soon(callback,argument)- Bu yöntem, mümkün olan en kısa sürede çağrılacak bir geri aramayı düzenler. Call_soon () döndükten sonra ve denetim olay döngüsüne geri döndüğünde geri çağrı çağrılır.
loop.time() - Bu yöntem, olay döngüsünün dahili saatine göre geçerli saati döndürmek için kullanılır.
asyncio.set_event_loop() - Bu yöntem, geçerli bağlam için olay döngüsünü döngüye ayarlayacaktır.
asyncio.new_event_loop() - Bu yöntem, yeni bir olay döngüsü nesnesi oluşturur ve döndürür.
loop.run_forever() - Bu yöntem stop () yöntemi çağrılana kadar çalışacaktır.
Misal
Aşağıdaki olay döngüsü örneği yazdırmaya yardımcı olur hello worldget_event_loop () yöntemini kullanarak. Bu örnek Python resmi belgelerinden alınmıştır.
import asyncio
def hello_world(loop):
print('Hello World')
loop.stop()
loop = asyncio.get_event_loop()
loop.call_soon(hello_world, loop)
loop.run_forever()
loop.close()
Çıktı
Hello World
Vadeli işlemler
Bu, gerçekleştirilmemiş bir hesaplamayı temsil eden concurrent.futures.Future sınıfıyla uyumludur. Asyncio.futures.Future ve concurrent.futures arasında aşağıdaki farklılıklar vardır.
result () ve exception () yöntemleri bir zaman aşımı argümanı almaz ve gelecek henüz tamamlanmadığında bir istisna yaratmaz.
Add_done_callback () ile kaydedilen geri aramalar her zaman olay döngüsünün call_soon () aracılığıyla çağrılır.
asyncio.futures.Future sınıfı, concurrent.futures paketindeki wait () ve as_completed () işlevleriyle uyumlu değildir.
Misal
Aşağıda, asyncio.futures.future sınıfını nasıl kullanacağınızı anlamanıza yardımcı olacak bir örnek verilmiştir.
import asyncio
async def Myoperation(future):
await asyncio.sleep(2)
future.set_result('Future Completed')
loop = asyncio.get_event_loop()
future = asyncio.Future()
asyncio.ensure_future(Myoperation(future))
try:
loop.run_until_complete(future)
print(future.result())
finally:
loop.close()
Çıktı
Future Completed
Coroutines
Asyncio'daki koroutinler kavramı, diş çekme modülünün altındaki standart Thread nesnesi konseptine benzer. Bu, altyordam kavramının genellemesidir. Bir koroutin, harici işlemeyi bekler ve harici işleme tamamlandığında durduğu noktadan geri dönmesi için yürütme sırasında askıya alınabilir. Aşağıdaki iki yol, eş anlamlıları uygulamamıza yardımcı olur -
eşzamansız def işlevi ()
Bu, Asyncio modülü altında coroutinlerin gerçeklenmesi için bir yöntemdir. Aşağıdakiler aynı için bir Python betiğidir -
import asyncio
async def Myoperation():
print("First Coroutine")
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(Myoperation())
finally:
loop.close()
Çıktı
First Coroutine
@ asyncio.coroutine dekoratör
Eşgüdümlerin gerçekleştirilmesi için başka bir yöntem, oluşturuculardan @ asyncio.coroutine dekoratörüyle birlikte kullanılmasıdır. Aşağıdakiler aynı için bir Python betiğidir -
import asyncio
@asyncio.coroutine
def Myoperation():
print("First Coroutine")
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(Myoperation())
finally:
loop.close()
Çıktı
First Coroutine
Görevler
Asyncio modülünün bu alt sınıfı, bir olay döngüsü içinde paralel bir şekilde eşgüdümlerin yürütülmesinden sorumludur. Aşağıdaki Python betiği, bazı görevleri paralel olarak işlemenin bir örneğidir.
import asyncio
import time
async def Task_ex(n):
time.sleep(1)
print("Processing {}".format(n))
async def Generator_task():
for i in range(10):
asyncio.ensure_future(Task_ex(i))
int("Tasks Completed")
asyncio.sleep(2)
loop = asyncio.get_event_loop()
loop.run_until_complete(Generator_task())
loop.close()
Çıktı
Tasks Completed
Processing 0
Processing 1
Processing 2
Processing 3
Processing 4
Processing 5
Processing 6
Processing 7
Processing 8
Processing 9
Taşımalar
Asyncio modülü, çeşitli iletişim türlerini uygulamak için taşıma sınıfları sağlar. Bu sınıflar iş parçacığı açısından güvenli değildir ve iletişim kanalı oluşturulduktan sonra her zaman bir protokol örneğiyle eşleştirilir.
Aşağıdakiler, BaseTransport'tan miras alınan farklı taşıma türleridir -
ReadTransport - Bu, salt okunur taşımalar için bir arayüzdür.
WriteTransport - Bu, salt yazılır taşımalar için bir arayüzdür.
DatagramTransport - Bu, verileri göndermek için bir arayüzdür.
BaseSubprocessTransport - BaseTransport sınıfına benzer.
Aşağıda, dört aktarım türünde sonradan geçici olan beş farklı BaseTransport sınıfı yöntemi verilmiştir:
close() - Taşıyıcıyı kapatır.
is_closing() - Aktarım kapanıyorsa veya zaten kapalıysa, bu yöntem true döndürür.
get_extra_info(name, default = none) - Bu bize ulaşımla ilgili bazı ekstra bilgiler verecektir.
get_protocol() - Bu yöntem mevcut protokolü döndürür.
Protokoller
Asyncio modülü, ağ protokollerinizi uygulamak için alt sınıflara ayırabileceğiniz temel sınıflar sağlar. Bu sınıflar, taşımalarla bağlantılı olarak kullanılır; protokol, gelen verileri ayrıştırır ve giden verilerin yazılmasını isterken, aktarım gerçek G / Ç ve arabelleğe alma işleminden sorumludur. Aşağıda üç Protokol sınıfı verilmiştir -
Protocol - Bu, TCP ve SSL aktarımlarıyla kullanım için akış protokollerini uygulamak için temel sınıftır.
DatagramProtocol - Bu, UDP aktarımlarıyla kullanım için veri birimi protokollerini uygulamak için temel sınıftır.
SubprocessProtocol - Bu, bir dizi tek yönlü kanal aracılığıyla alt süreçlerle iletişim kuran protokolleri uygulamak için temel sınıftır.