Có bao nhiêu cách bạn có thể tạo một chủ đề trong python?

Trong hướng dẫn này, chúng ta sẽ tìm hiểu sâu về các luồng trong Python. Chúng tôi sẽ bắt đầu bằng cách trình bày những gì chúng bao gồm, sau đó chúng tôi sẽ đề cập đến cách bạn có thể xác định các luồng đơn giản của riêng mình trong các chương trình Python của mình và cuối cùng chúng tôi sẽ đề cập đến tất cả các cách bạn có thể làm việc với các luồng đơn giản này trong một Python đơn giản

Chủ đề là gì?

Các chủ đề về cơ bản chỉ là các luồng hướng dẫn được sắp xếp. Tôi. e. làm điều này 5 lần và sau đó kết thúc. Chúng có thể được lên lịch để chạy bởi hệ điều hành và có thể chạy song song trên nhiều lõi hoặc đồng thời trên một lõi

Các luồng thường nằm trong một quy trình gốc, quy trình này chúng ta sẽ đề cập sau trong khóa học và thường bao gồm 4 điều

  1. Bộ đếm chương trình
  2. Một chồng
  3. Một tập hợp các thanh ghi
  4. Mã định danh

Các luồng trong một hệ điều hành thường có thể tương tác với các tài nguyên được chia sẻ và thực sự có thể giao tiếp giữa nhiều luồng. Vì họ có thể chia sẻ các tài nguyên như bộ nhớ, nên họ cũng có thể sửa đổi mọi thứ theo cách đồng thời hoặc thậm chí song song. Tuy nhiên, khi hai luồng bắt đầu sửa đổi điều gì đó đồng thời, điều quan trọng cần lưu ý là nếu bạn không đặt các biện pháp bảo vệ và kiểm tra thích hợp trong mã của mình, thì bạn có thể thấy các điều kiện tương tranh bắt đầu tạo ra sự cố.

Các loại chủ đề

Có hai loại chủ đề riêng biệt. đó là

  1. Chủ đề cấp người dùng. Đây là những thứ chúng ta có thể tích cực chơi với mã của mình, v.v.
  2. Chủ đề cấp hạt nhân. Đây là những luồng cấp rất thấp hoạt động thay mặt cho hệ điều hành

đa luồng

Khi mọi người thường nói về bộ xử lý đa luồng, họ thường đề cập đến một bộ xử lý có thể chạy nhiều luồng đồng thời. Chúng thường có 2 hoặc nhiều luồng cạnh tranh tích cực về thời gian thực thi trong một lõi và khi một luồng bỏ cuộc hoặc dừng lại, lõi xử lý sẽ bắt đầu thực thi một luồng khác. Nó chuyển ngữ cảnh giữa các luồng này rất nhanh và tạo ấn tượng rằng máy tính đang chạy mọi thứ song song

Tạo một chủ đề đơn giản

Trước khi bắt đầu tạo một luồng trong Python, chúng ta nên xem qua hàm tạo của lớp Thread trong Python và xem những gì chúng ta cần truyền vào

## Python Thread class Constructor
def __init__[self, group=None, target=None, name=None, args=[], kwargs=None, verbose=None]:

Nó có năm tham số riêng biệt

  1. tập đoàn. một tham số đặc biệt được dành riêng cho phần mở rộng trong tương lai
  2. Mục tiêu. đối tượng có thể gọi được sẽ được gọi bởi phương thức chạy [], nếu Không thì sẽ không có gì được bắt đầu…
  3. Tên. Tên chủ đề của chúng tôi
  4. tranh luận. bộ đối số cho lệnh gọi đích. mặc định là

    from time import sleep, perf_counter

    Code language: Python [python]
    6
  5. kwargs. đối số từ khóa từ điển để gọi hàm tạo của lớp cơ sở

Điều quan trọng cần chú ý là tham số

from time import sleep, perf_counter

Code language: Python [python]
7. Để bắt đầu một luồng đơn giản, chúng ta cần truyền cho nó một thứ gì đó để chạy. Hãy tạo một hàm đơn giản mà sau đó chúng ta sẽ sử dụng để tạo chuỗi đầu tiên của mình như vậy

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

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.']

Code language: Python [python]

Làm thế nào nó hoạt động

Đầu tiên, nhập các hàm

def task[]: print['Starting a task...'] sleep[1] print['done']

Code language: Python [python]
7 và

def task[]: print['Starting a task...'] sleep[1] print['done']

Code language: Python [python]
8 từ mô-đun

def task[]: print['Starting a task...'] sleep[1] print['done']

Code language: Python [python]
9

from time import sleep, perf_counter

Code language: Python [python]

Thứ hai, xác định chức năng mất một giây để hoàn thành

def task[]: print['Starting a task...'] sleep[1] print['done']

Code language: Python [python]

Thứ ba, lấy giá trị của bộ đếm hiệu suất bằng cách gọi hàm

def task[]: print['Starting a task...'] sleep[1] print['done']

Code language: Python [python]
8

________số 8

Thứ tư, gọi hàm

start_time = perf_counter[]

Code language: Python [python]
1 hai lần

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.']

Code language: Python [python]
0

Thứ năm, lấy giá trị của bộ đếm hiệu suất bằng cách gọi hàm

def task[]: print['Starting a task...'] sleep[1] print['done']

Code language: Python [python]
8

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.']

Code language: Python [python]
2

Cuối cùng, xuất thời gian cần thiết để hoàn thành việc chạy hàm

start_time = perf_counter[]

Code language: Python [python]
1 hai lần

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.']

Code language: Python [python]
4

Đây là đầu ra

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.']

Code language: Python [python]
5

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

start_time = perf_counter[]

Code language: Python [python]
1 10 lần, sẽ mất khoảng 10 giây để hoàn thành

Sơ đồ sau minh họa cách hoạt động của chương trình

Đầu tiên, hàm

start_time = perf_counter[]

Code language: Python [python]
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ành

Khi hàm

start_time = perf_counter[]

Code language: Python [python]
1 gọi hàm

def task[]: print['Starting a task...'] sleep[1] print['done']

Code language: Python [python]
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ên

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

start_time = perf_counter[]

Code language: Python [python]
8

Đầu tiên, nhập lớp

start_time = perf_counter[]

Code language: Python [python]
9 từ mô-đun

start_time = perf_counter[]

Code language: Python [python]
8

def task[]: print['Starting a task...'] sleep[1] print['done']

Code language: Python [python]
3

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

start_time = perf_counter[]

Code language: Python [python]
9

def task[]: print['Starting a task...'] sleep[1] print['done']

Code language: Python [python]
5

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.']

Code language: Python [python]
02 chấp nhận nhiều tham số. Những cái chính là

  • 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.']

    Code language: Python [python]
    03. chỉ định một chức năng [

    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.']

    Code language: Python [python]
    04] để chạy trong chủ đề mới
  • 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.']

    Code language: Python [python]
    05. chỉ định các đối số của hàm [______104]. Đối số

    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.']

    Code language: Python [python]
    05 là một bộ

Thứ ba, bắt đầu luồng bằng cách gọi phương thức

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.']

Code language: Python [python]
08 của thể hiện

start_time = perf_counter[]

Code language: Python [python]
9

from time import sleep, perf_counter

Code language: Python [python]
0

Nếu bạn muốn đợi luồng hoàn thành trong luồng chính, bạn có thể gọi phương thức

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.']

Code language: Python [python]
20

from time import sleep, perf_counter

Code language: Python [python]
1

Bằng cách gọi phương thức

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.']

Code language: Python [python]
20, luồng chính sẽ đợi luồng thứ hai hoàn thành trước khi kết thúc

Chương trình sau minh họa cách sử dụng module

start_time = perf_counter[]

Code language: Python [python]
8

from time import sleep, perf_counter

Code language: Python [python]
2

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

from time import sleep, perf_counter

Code language: Python [python]
3

Thứ hai, bắt đầu cả hai luồng bằng cách gọi phương thức

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.']

Code language: Python [python]
08

from time import sleep, perf_counter

Code language: Python [python]
4

Thứ ba, đợi cả hai chủ đề hoàn thành

from time import sleep, perf_counter

Code language: Python [python]
5

Cuối cùng, hiển thị thời gian thực hiện

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.']

Code language: Python [python]
4

đầu ra

from time import sleep, perf_counter

Code language: Python [python]
7

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

from time import sleep, perf_counter

Code language: Python [python]
8

Làm thế nào nó hoạt động

Đầu tiên, xác định một hàm

start_time = perf_counter[]

Code language: Python [python]
1 chấp nhận một đối số

from time import sleep, perf_counter

Code language: Python [python]
9

Thứ hai, tạo 10 chủ đề mới và chuyển id cho mỗi chủ đề. Danh sách

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.']

Code language: Python [python]
25 được sử dụng để theo dõi tất cả các chủ đề mới được tạo

def task[]: print['Starting a task...'] sleep[1] print['done']

Code language: Python [python]
0

Lưu ý rằng nếu bạn gọi phương thức

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.']

Code language: Python [python]
20 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 theo

Thứ ba, đợi tất cả các luồng hoàn thành bằng cách gọi phương thức

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.']

Code language: Python [python]
20

def task[]: print['Starting a task...'] sleep[1] print['done']

Code language: Python [python]
1

Sau đây là kết quả đầu ra của chương trình

def task[]: print['Starting a task...'] sleep[1] print['done']

Code language: Python [python]
2

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. ,

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.']

Code language: Python [python]
28. 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ệp

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

Có bao nhiêu luồng có thể được tạo cùng một lúc trong Python?

Chi tiết triển khai CPython. Trong CPython, do Khóa phiên dịch toàn cầu, chỉ một luồng có thể thực thi mã Python cùng một lúc [mặc dù một số thư viện định hướng hiệu năng có thể khắc phục hạn chế này].

Chúng ta có thể tạo chủ đề bằng Python không?

Phân luồng Python cho phép bạn chạy đồng thời các phần khác nhau của chương trình và có thể đơn giản hóa thiết kế của bạn . Nếu bạn đã có một số kinh nghiệm về Python và muốn tăng tốc chương trình của mình bằng cách sử dụng các luồng, thì hướng dẫn này là dành cho bạn.

Python có thể có nhiều luồng không?

Tóm lại, phân luồng trong Python cho phép tạo nhiều luồng trong một quy trình duy nhất , nhưng do GIL, sẽ không có luồng nào trong số chúng . Phân luồng vẫn là một lựa chọn rất tốt khi chạy đồng thời nhiều tác vụ ràng buộc I/O.

Chủ Đề