Hôm nay chúng ta sẽ đi vào bài 1.5. Ở bài này, chúng ta sẽ cùng nhau đi tìm hiểu về Queue(hàng đợi) trong python nhé. Nào, bắt đầu vào công việc thôi.
1. Cơ bản về Queue
Để sử dụng Queue các bạn cần import nó vào Python:
Về cơ bản thì queue cũng giống như list:
Đoạn mã trên tạo ra một list, gán cho nó 3 giá trị, sau đó loại bỏ giá trị đầu tiên trong danh sách nên bây giờ chỉ có 2 giá trị (trong đó có 2,4).
Chỉ có 1 vài khác biệt trong cách queue làm việc. Đầu tiên là chúng ta thiết lập 1 kích thước tối đa vào hàng đợi, trong đó 0 nghĩa là vô hạn. Tuy hơi ngớ ngẩn nhưng tôi chắc chắn nó sẽ hữu ích trong 1 số trường hợp. Sự khác biệt thứ 2 là phần task_done() ở cuối. Nó nói cho queue rằng tôi không chỉ lấy thông tin từ danh sách, nhưng cũng hoàn thành với nó. Nếu như không có task_done(), sẽ có rắc rối khi làm việc với luồng. Vì vậy, khi làm việc với queue, bạn phải gọi nó.
Điều quan trọng lớn hơn về queue là nó làm việc vô cùng tốt với luồng. Trong thực tế, bạn không thể sử dụng danh sách như cách bạn sử dụng queue trong luồng.
Đây là 1 ví dụ đơn giản về 1 chương trình có xử dụng hàng đợi:
Kết quả nhận được là 0 - 19. Nó giống như là cách phức tạp nhất để in ra số từ 0 - 19. Chú ý làm sao do_stuff() làm việc thông qua hàng đợi. Nó khá là tốt. Nhưng nếu như chúng ta làm việc với 1 nhiệm vụ lớn, hoặc một công việc đòi hỏi nhiều chờ đợi ( như kéo dữ liệu từ API)? Giải sử cho rằng do_stuff() mất 30s để chạy mỗi lần và nó chỉ chờ đợi các API ngốc nghếch phản hồi 1 cái gì đó. Hàm sẽ mất 30s mỗi khi nó chay, và nó sẽ phải 20 lần vì vậy nó mất tổng cộng 10 phút để có được 20 bản ghi. Đó thực sự là không tốt. Hãy sử dụng Python Threading
2. Queue và Thread
Như bài trước thì Thread(luồng) có lẽ khá phức tạp, nhưng nó khá hiệu quả cho trường hợp này. Mặc dù chúng sử dụng cùng chức năng để làm công việc, nhưng chúng chạy cùng 1 thời gian, và bạn có thể kéo chúng lại khi chũng làm việc. Đầu tiên tạo chức năng:
Bây h chúng ta sẽ tạo các thread thực sự và cho chúng chạy. Trước khi tôi làm điều đó, tôi cần cung cấp cho họ một queue để làm việc. Queue chỉ cần được định nghĩa để thread hiểu chúng làm việc trên cái gì. Đây là cách tôi thiết lập thread:
Bạn nhìn thấy cách q được cài đặt ( như "q") và tôi định nghĩa 1 vòng lặp để chạy việc tạo 10 thread. Dòng đầu tiên trong vòng lặp thiết lập một thread và chỉ định chức năng đầu tiên của nó là do_stuff(), sau đó thêm "q" là Queue tôi đã định nghĩa. Sau đó là về một deamon,và cuối cùng là khởi động thread. Đó chính là cách tạo ra 10 thread chạy là chờ chúng ta đẩy 1 cái gì đó vào Queue.
Đây là code hoàn chỉnh cho phần này:
q.join() ở cuối chương trình được sử dụng để chờ cho đến khi Queue rỗng và tất cả các Thread đã làm việc xong. OK, chương trình hoạt động vô cùng nhanh và hiệu quả. Hãy nhớ lại ví dụ lúc trước, chúng ta mất 10 phút để thực hiện do_stuff() thì bây h, chúng ta chỉ cần mất 30s khi sửa đổi lên 20 thread. Vô cùng tuyệt vời đúng không.
Bài tập cho phần này:
1. Cơ bản về Queue
Để sử dụng Queue các bạn cần import nó vào Python:
Code:
from Queue import Queue
Code:
my_list = [] my_list.append(1) my_list.append(2) my_list.append(4) print my_list.pop(0) #output: 1
Code:
my_queue = Queue (maxsize = 0) my_queue.put (1) my_queue.put (2) my_queue.put (3) print my_queue.get () my_queue.task_done () # Output: 1
Điều quan trọng lớn hơn về queue là nó làm việc vô cùng tốt với luồng. Trong thực tế, bạn không thể sử dụng danh sách như cách bạn sử dụng queue trong luồng.
Đây là 1 ví dụ đơn giản về 1 chương trình có xử dụng hàng đợi:
Code:
def do_stuff(q): while not q.empty(): print q.get() q.task_done() q = Queue(maxsize=0) for x in range(20): q.put(x) do_stuff(q)
2. Queue và Thread
Code:
from Queue import Queue from threading import Thread
Code:
def do_stuff(q): while True: print q.get() q.task_done()
Code:
q = Queue(maxsize=0) num_threads = 10 for i in range(num_threads): worker = Thread(target=do_stuff, args=(q,)) worker.setDaemon(True) worker.start()
Bạn nhìn thấy cách q được cài đặt ( như "q") và tôi định nghĩa 1 vòng lặp để chạy việc tạo 10 thread. Dòng đầu tiên trong vòng lặp thiết lập một thread và chỉ định chức năng đầu tiên của nó là do_stuff(), sau đó thêm "q" là Queue tôi đã định nghĩa. Sau đó là về một deamon,và cuối cùng là khởi động thread. Đó chính là cách tạo ra 10 thread chạy là chờ chúng ta đẩy 1 cái gì đó vào Queue.
Đây là code hoàn chỉnh cho phần này:
Code:
from Queue import Queue from threading import Thread def do_stuff(q): while True: print q.get() q.task_done() q = Queue(maxsize=0) num_threads = 10 for i in range(num_threads): worker = Thread(target=do_stuff, args=(q,)) worker.setDaemon(True) worker.start() for x in range(100): q.put(x) q.join()
Bài tập cho phần này:
- Tạo 10 user FTP ở 10 site khác nhau. Sau đó viết 1 chương trình cho phép đăng nhập 10 site này và in ra các tập tin có trong thư mục home của các user.
No comments:
Post a Comment