Bu sorun programınızın o blokta "single-threaded" olarak çalışmasından kaynaklanıyor. Sorunu çözmek için çeşitli yöntemler bulunsa da en hızlı ve kolay yol "multi-threaded" işlem seçeneğinidir. Buna ek olarak işlemleriniz çok kısa ise "thread pool" oluştuma yöntemi genellikle daha performanslı ve az kaynak tüketebilir ancak biraz daha tecrübe ve ayarlama gerektirmektedir.
Pratikte yaptığınız işlem şudur;
import time;
def m1():
print('1');
def m2():
time.sleep(2);
print(2);
def m3():
print(3);
m1();
m2();
m3();Çıktı;
1
2
(2 saniye donma)
3
Mantık;
|
1
|
2
|
3
|
|
m1 metoduna kadar normal işlemler gerçekleşiyor. Ancak siz programın normal akışı içerisinde kendi yazdığınız
m2 methodu ile müdahale ediyorsunuz(mesaj gönderiyorsunuz) ve bu metodun çalışması(mesajın gönderilmesi) uzun sürüyor.
m2 metodu işini bitirdiğinde(size mesajı göndermeyi tamamladığınızda) program normal akışına devam ediyor. Yukarıdaki örnekte program
m2 metoduna geldiğinde 2 saniye kadar bekliyor. Bu süreyi ağ işleminin tamamlanması için geçen süre olarak düşününün. 2 saniye sonra
m3 metodu çalışıyor ve ekrana "3" yazısı çıkıyor.
Buradan itibaren sizin yapmayı isteyeceğiniz şey
m2 metodunun programın akışını etkilememesini sağlamak olmalı. Bu yüzden m2 metodunu çalıştıracak yeni bir "thread" oluşturmanız gereklidir.
import time;
import threading;
def m1():
print('1');
def m2():
time.sleep(2);
print(2);
def m3():
print(3);
m1();
t = threading.Thread(target=m2);
t.start();
m3();Çıktı;
1
(Donma yok)
3
(Mesaj gönderme işlemi başka bir thread tarafından bitiriliyor)
2
Mantık;
|
1
| \
3 2
|
Bu şekilde
m2 (mesaj gönderme) metodunun tamamlanması için gereken süre ya da
m2 metodunda(alt "thread"da demek daha doğru olur) ortaya çıkacak bir hata ("runtime" hataları) ana programın(üst "thread" demek daha doğru olur) akışını etkilemez.