Thông thường, cách thực hiện điều này sẽ là sử dụng nhóm luồng và hàng đợi tải xuống sẽ đưa ra một tín hiệu, hay còn gọi là sự kiện, khi tác vụ đó hoàn tất xử lý. Bạn có thể làm điều này trong phạm vi mô-đun phân luồng mà Python cung cấp.
Để thực hiện các hành động đã nói, tôi sẽ sử dụng các đối tượng sự kiện và mô-đun Hàng đợi .
Tuy nhiên, có thể thấy một minh chứng nhanh chóng và rõ ràng về những gì bạn có thể làm bằng cách threading.Thread
triển khai đơn giản dưới đây:
import os
import threading
import time
import urllib2
class ImageDownloader(threading.Thread):
def __init__(self, function_that_downloads):
threading.Thread.__init__(self)
self.runnable = function_that_downloads
self.daemon = True
def run(self):
self.runnable()
def downloads():
with open('somefile.html', 'w+') as f:
try:
f.write(urllib2.urlopen('http://google.com').read())
except urllib2.HTTPError:
f.write('sorry no dice')
print 'hi there user'
print 'how are you today?'
thread = ImageDownloader(downloads)
thread.start()
while not os.path.exists('somefile.html'):
print 'i am executing but the thread has started to download'
time.sleep(1)
print 'look ma, thread is not alive: ', thread.is_alive()
Có lẽ sẽ có ý nghĩa nếu không thăm dò ý kiến như tôi đang làm ở trên. Trong trường hợp đó, tôi sẽ thay đổi mã thành này:
import os
import threading
import time
import urllib2
class ImageDownloader(threading.Thread):
def __init__(self, function_that_downloads):
threading.Thread.__init__(self)
self.runnable = function_that_downloads
def run(self):
self.runnable()
def downloads():
with open('somefile.html', 'w+') as f:
try:
f.write(urllib2.urlopen('http://google.com').read())
except urllib2.HTTPError:
f.write('sorry no dice')
print 'hi there user'
print 'how are you today?'
thread = ImageDownloader(downloads)
thread.start()
thread.join()
Lưu ý rằng không có cờ daemon nào được đặt ở đây.
import threading, time; wait=lambda: time.sleep(2); t=threading.Thread(target=wait); t.start(); print('end')
). Tôi đã hy vọng "lý lịch" ngụ ý cũng được tách ra.