03/12/2018, 22:06

Cách viết Python code concurrent chỉ với 3 dòng

Hôm nay tôi sẽ chia sẻ với các bạn một mẹo hay dùng trong Python’s standard library. Toàn bộ code chạy trên Python 3.2+ mà không cần thêm bất kì package ngoài nào khác. Vấn đề được đặt ra Giả sử như bạn có tới hàng trăm ngàn URL cần phải được xử lí/download/ xem xét, như vậy ...

Hôm nay tôi sẽ chia sẻ với các bạn một mẹo hay dùng trong Python’s standard library. Toàn bộ code chạy trên Python 3.2+ mà không cần thêm bất kì package ngoài nào khác.

Vấn đề được đặt ra

Giả sử như bạn có tới hàng trăm ngàn URL cần phải được xử lí/download/xem xét, như vậy bạn sẽ cần thật nhiều HTTP GET call cũng như thu thập kết quả của mỗi lần gọi.

Như các bạn đã thấy, Python sẽ lặp (iterate) trên 1000 URL và gọi từng đường link.

Quá trình này sẽ chiếm 2% công suất của CPU và phần lớn thời gian sẽ dành cho việc chờ I/O:

Như vậy, một lần chạy trung bình mất tới 14 phút.

Mẹo để tối ưu hóa

Hãy xem đã có gì thay đổi

Vậy là chỉ với 3 dòng code, chúng ta đã biến một serial task chậm chạp thành diễn ra đồng thời (concurrent ), với chỉ 5 phút chạy:

Chờ đã, vẫn còn điều thú vị khác

Điều đặc biệt của API này là bạn có thể thay thế

thành

để cho Python sử dụng processes thay vì thread, khi đấy thời gian chạy sẽ là:

Tốc độ chạy được cải thiện 20 giây so với phiên bản xài thread.

Kết luận

Tôi nghĩ rằng ThreadPoolExecutor và ProcessPoolExecutor là những bổ sung siêu “ngầu” cho Python’s standard library. Dù bạn có thể đã làm hầu hết mọi thứ với threading, multiprocessing và FIFO queues nhưng API này thật sự tốt hơn rất nhiều.

Techtalk via Dev.to

0