Bản tóm tắt. trong hướng dẫn này, bạn sẽ học cách sử dụng mô-đun luồng Python để phát triển các ứng dụng đa luồng
Ứng dụng đơn luồng
Hãy bắt đầu với một chương trình đơn giản
Code language: Python [python]
from time import sleep, perf_counter def task[]: print['Starting a task...'] sleep[1] print['done'] start_time = perf_counter[] task[] task[] end_time = perf_counter[] print[f'It took {end_time- start_time: 0.2f} second[s] to complete.']
Làm thế nào nó hoạt động
Đầu tiên, nhập các hàm
7 vàCode language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
8 từ mô-đunCode language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
9Code language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
Code language: Python [python]
from time import sleep, perf_counter
Thứ hai, xác định chức năng mất một giây để hoàn thành
Code language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
Thứ ba, lấy giá trị của bộ đếm hiệu suất bằng cách gọi hàm
8Code language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
Code language: Python [python]
start_time = perf_counter[]
Thứ tư, gọi hàm
1 hai lầnCode language: Python [python]
start_time = perf_counter[]
Code language: Python [python]
task[] task[]
Thứ năm, lấy giá trị của bộ đếm hiệu suất bằng cách gọi hàm
8Code language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
1Code language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
Cuối cùng, xuất thời gian cần thiết để hoàn thành việc chạy hàm
1 hai lầnCode language: Python [python]
start_time = perf_counter[]
3Code language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
Đây là đầu ra
4
def task[]: print['Starting a task...'] sleep[1] print['done']
Code language: Python [python]
Như bạn có thể mong đợi, chương trình mất khoảng hai giây để hoàn thành. Nếu bạn gọi hàm
1 10 lần, sẽ mất khoảng 10 giây để hoàn thànhCode language: Python [python]
start_time = perf_counter[]
Sơ đồ sau minh họa cách hoạt động của chương trình
Đầu tiên, hàm
1 thực thi và ngủ trong một giây. Sau đó, nó thực thi lần thứ hai và cũng ngủ thêm một giây nữa. Cuối cùng, chương trình hoàn thànhCode language: Python [python]
start_time = perf_counter[]
Khi hàm
1 gọi hàmCode language: Python [python]
start_time = perf_counter[]
7, CPU không hoạt động. Nói cách khác, CPU không làm gì cả, điều này không hiệu quả về mặt sử dụng tài nguyênCode language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
Chương trình này có một tiến trình với một luồng duy nhất, được gọi là luồng chính. Vì chương trình chỉ có một luồng nên được gọi là chương trình đơn luồng
Sử dụng luồng Python để phát triển một ví dụ về chương trình đa luồng
Để tạo một chương trình đa luồng, bạn cần sử dụng mô-đun Python
8Code language: Python [python]
start_time = perf_counter[]
Đầu tiên, nhập lớp
9 từ mô-đunCode language: Python [python]
start_time = perf_counter[]
8Code language: Python [python]
start_time = perf_counter[]
2Code language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
Thứ hai, tạo một luồng mới bằng cách khởi tạo một thể hiện của lớp
9Code language: Python [python]
start_time = perf_counter[]
4Code language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
2 chấp nhận nhiều tham số. Những cái chính làCode language: Python [python]
task[] task[]
3. chỉ định một hàm [
Code language: Python [python]task[] task[]
4] để chạy trong luồng mới
Code language: Python [python]task[] task[]
5. chỉ định các đối số của hàm [______94]. Đối số
Code language: Python [python]task[] task[]
5 là một Tuple
Code language: Python [python]task[] task[]
Thứ ba, bắt đầu luồng bằng cách gọi phương thức
8 của thể hiện
task[] task[]
Code language: Python [python]
9Code language: Python [python]
start_time = perf_counter[]
0Code language: Python [python]
from time import sleep, perf_counter
Nếu bạn muốn chờ tiểu trình hoàn thành trong tiểu trình chính, bạn có thể gọi phương thức
10Code language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
1Code language: Python [python]
from time import sleep, perf_counter
Bằng cách gọi phương thức
10, luồng chính sẽ đợi luồng thứ hai hoàn thành trước khi kết thúcCode language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
Chương trình sau minh họa cách sử dụng mô-đun
8Code language: Python [python]
start_time = perf_counter[]
2Code language: Python [python]
from time import sleep, perf_counter
Làm thế nào nó hoạt động. [và chúng tôi sẽ chỉ tập trung vào phần luồng]
Đầu tiên, tạo hai chủ đề mới
3Code language: Python [python]
from time import sleep, perf_counter
Thứ hai, bắt đầu cả hai luồng bằng cách gọi phương thức
8Code language: Python [python]
task[] task[]
4Code language: Python [python]
from time import sleep, perf_counter
Thứ ba, đợi cả hai chủ đề hoàn thành
5Code language: Python [python]
from time import sleep, perf_counter
Cuối cùng, hiển thị thời gian thực hiện
3Code language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
đầu ra
7Code language: Python [python]
from time import sleep, perf_counter
Khi chương trình thực thi, nó sẽ có ba luồng. luồng chính được tạo bởi trình thông dịch Python và hai luồng được tạo bởi chương trình
Như được hiển thị rõ ràng từ đầu ra, chương trình mất một giây thay vì hai giây để hoàn thành
Sơ đồ sau đây cho thấy các luồng thực thi như thế nào
Truyền đối số cho chủ đề
Chương trình sau đây cho thấy cách truyền đối số cho hàm được gán cho luồng
8Code language: Python [python]
from time import sleep, perf_counter
Làm thế nào nó hoạt động
Đầu tiên, xác định một hàm
1 chấp nhận một đối sốCode language: Python [python]
start_time = perf_counter[]
9Code language: Python [python]
from time import sleep, perf_counter
Thứ hai, tạo 10 chủ đề mới và chuyển id cho mỗi chủ đề. Danh sách
15 được sử dụng để theo dõi tất cả các chủ đề mới được tạoCode language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
0Code language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
Lưu ý rằng nếu bạn gọi phương thức
10 bên trong vòng lặp, chương trình sẽ đợi luồng đầu tiên hoàn thành trước khi bắt đầu luồng tiếp theoCode language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
Thứ ba, đợi tất cả các luồng hoàn thành bằng cách gọi phương thức
10Code language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
1Code language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
Sau đây là kết quả đầu ra của chương trình
2Code language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
Nó chỉ mất 1. 05 giây để hoàn thành
Chú ý chương trình không thực hiện luồng theo thứ tự từ 1 đến 10
Khi nào nên sử dụng luồng Python
Như đã giới thiệu trong phần hướng dẫn process và thread, có 2 nhiệm vụ chính
- Các tác vụ liên quan đến I/O – thời gian dành cho I/O nhiều hơn đáng kể so với thời gian dành cho tính toán
- Các tác vụ liên quan đến CPU – thời gian dành cho tính toán cao hơn đáng kể so với thời gian chờ I/O
Luồng Python được tối ưu hóa cho các tác vụ ràng buộc I/O. Ví dụ: yêu cầu tài nguyên từ xa, kết nối máy chủ cơ sở dữ liệu hoặc đọc và ghi tệp
Một ví dụ luồng Python thực tế
Giả sử rằng bạn có một danh sách các tệp văn bản trong một thư mục e. g. ,
18. Và bạn muốn thay thế một văn bản bằng một văn bản mới trong tất cả các tệpCode language: Python [python]
def task[]: print['Starting a task...'] sleep[1] print['done']
Chương trình đơn luồng sau đây cho biết cách thay thế chuỗi con bằng chuỗi con mới trong tệp văn bản