Python Threading Ve Queue
-
import Queue,threading,time q = Queue.Queue() def worker(): print "Worker starting..." for i in range(3): print str(i) + " is starting." time.sleep(1) print str(i) + " is complete." q.put(i) def upload(): if q.qsize() != 0: uplink = q.get() print "\nFinished prcs catched, file uploading..." time.sleep(2) print str(uplink) + " was uploaded." q.task_done() if q.qsize() == 0: return False return True if __name__ == "__main__": w = threading.Thread(target=worker) w.start() while True: if not upload(): break q.join() w.join()
Bu kodlar pseudo kafamdaki olayı anlatmak için yazdım. Burada worker fonkunun sleep'ini upload fonkundan yüksek tutunca kuyruğa veri geç eklendiği için while'dan çıkıyor diğer verileri işlemiyor, başka türlü while'dan çıkma mekanizması aklıma gelmedi. Ama yapmak istediğim olay bu. Örnekle açıklarsam, 1. fonksiyon videoları indiricek indirilen video upload edilecek bu sırada videoların inmesi devam edicek. Gerçek kodda video indirmeler bazen uploaddan uzun veya kısa oluyor o yüzden örnek olması için sleep ekledim.
Soruma gelirsek kuyruğa yeni veri eklendikçe eklenen veriyi nasıl işleme sokabilirim ? -
Queue mantığının damına koymuşsun hocam :D
https://docs.python.org/2/library/queue.html#Queue.Queue.join
örneğin en sonundaki q.join yerine while koydun mu tamamdır
genel mantık bu şekildedir
ne yaptığından bahsetsen daha açık bir şekilde, belki faydamız dokunacak da
youtube'a spam bot yazıon herhalde ? :D
mantık değiştirecek olursak
1- downloader.py
2- uploader.py
downloader.py : verilen urlleri indiren, indirinceye kadar dosya ismi dosya.tmp kalacak
uploader.py : .tmp dosyalarını yoksayarak, bulduğu dosyaları upload edecek, sonra silecek
YekteranBaymedir tarafından 11/Kas/15 20:44 tarihinde düzenlenmiştir -
Daft bunu yazdı
Queue mantığının damına koymuşsun hocam :D
https://docs.python.org/2/library/queue.html#Queue.Queue.join
örneğin en sonundaki q.join yerine while koydun mu tamamdır
genel mantık bu şekildedir
ne yaptığından bahsetsen daha açık bir şekilde, belki faydamız dokunacak da
youtube'a spam bot yazıon herhalde ? :D
mantık değiştirecek olursak
1- downloader.py
2- uploader.py
downloader.py : verilen urlleri indiren, indirinceye kadar dosya ismi dosya.tmp kalacak
uploader.py : .tmp dosyalarını yoksayarak, bulduğu dosyaları upload edecek, sonra silecek
Öyle bi şey spam değil de (bi düşününce spam da olabilir :P) bi site var oradan videoları çekip ffmpegle renderleyip youtube 'a upluyorum. Sorun şu ki çok zaman alıyor ilk once videolar iniyor sonra render sonra upload ölüm. Yapmak istediğim olay dediğin gibi videolar inerken inen videoları renderlıcak aynı sırada video inmesi devam edicek sonra renderlanan uplanacak, bu dediğimi yapmıştım ama rendera gerek kalmadığını fark ettim aradan onu çıkarınca işler karıştı kuyruğa veriler geç girdiği için döngümden çıkıyor diğerlerini uplamıyor ffmpeg varken aradaki sureyi renderla kapıyordum.
-
diyom ya 2 tane sürekli arkaplanda çalışan script yazıcan
downloader socket ile veya txt dosyası ile urlleri alacak
sadece downloader'ın erişebildiği daha_önce_indirdiklerim.txt olacak böylece aynı videoyu tekrar tekrar indirmeyecek
download bitene kadar dosya uzantısı .tmp olacak
uploader aynı klasördeki uzantısı tmp olmayan videoları bulacak (glob.glob)
upload sorunsuz hallolunca da dosyayı silecek
thread mhread uğraşmaya gerek yok böyle daha kolay olur
tek yapman gereken url listesini güncellemek
echo "yeni url" >> urllist.txt gibi
-
import threading,Queue,time,random THREADS = 10 class Run(threading.Thread): def __init__(self, queue): self.__queue = queue threading.Thread.__init__(self) def run(self): while 1: item = self.__queue.get() if item is None: break time.sleep(random.randint(10, 100) / 1000.0) print "task", item, "finished" queue = Queue.Queue(0) for i in range(THREADS): Run(queue).start() for i in range(10): queue.put(i) for i in range(THREADS): queue.put(None)
boyle bir kontrolcu tanimlasan iyi olmaz mi umut kardesim?
-
Naacal bunu yazdı
import threading,Queue,time,random THREADS = 10 class Run(threading.Thread): def __init__(self, queue): self.__queue = queue threading.Thread.__init__(self) def run(self): while 1: item = self.__queue.get() if item is None: break time.sleep(random.randint(10, 100) / 1000.0) print "task", item, "finished" queue = Queue.Queue(0) for i in range(THREADS): Run(queue).start() for i in range(10): queue.put(i) for i in range(THREADS): queue.put(None)
boyle bir kontrolcu tanimlasan iyi olmaz mi umut kardesim?
Harbiden nasıl aklıma gelmedi :D Teşekkür ettim şuan istediğim gibi oldu. http://paste.ubuntu.com/13231932/
-
Daft bunu yazdı
diyom ya 2 tane sürekli arkaplanda çalışan script yazıcan
downloader socket ile veya txt dosyası ile urlleri alacak
sadece downloader'ın erişebildiği daha_önce_indirdiklerim.txt olacak böylece aynı videoyu tekrar tekrar indirmeyecek
download bitene kadar dosya uzantısı .tmp olacak
uploader aynı klasördeki uzantısı tmp olmayan videoları bulacak (glob.glob)
upload sorunsuz hallolunca da dosyayı silecek
thread mhread uğraşmaya gerek yok böyle daha kolay olur
tek yapman gereken url listesini güncellemek
echo "yeni url" >> urllist.txt gibi
Mantık güzel kafama yattı boş bi zamanda kodları yeniden düzenleyip denicem sağol.