PYTHON CONCURRENCY
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.

Các luồng Daemon trong Python

Trong bài viết này, bạn sẽ học về các luồng daemon trong Python và cách sử dụng chúng hiệu quả. Python cung cấp khả năng tạo và quản lý các luồng, cho phép bạn thực hiện các tác vụ đồng thời. Điều này đặc biệt hữu ích khi bạn muốn thực hiện các tác vụ ở chế độ nền mà không ảnh hưởng đến luồng chính của chương trình. Bằng cách sử dụng các luồng daemon, bạn có thể đảm bảo rằng các tác vụ nền này sẽ tự động kết thúc khi chương trình chính kết thúc, giúp tối ưu hóa hiệu suất và quản lý tài nguyên hiệu quả hơn.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Giới thiệu về luồng daemon trong Python

Trong Python, mọi chương trình đều có ít nhất một luồng gọi là luồng chính (main thread). Để tạo một chương trình có nhiều luồng, bạn sử dụng module threading. Bằng cách sử dụng nhiều luồng, bạn có thể thực hiện các tác vụ đồng thời.

Đôi khi, bạn muốn thực hiện một tác vụ ở chế độ nền. Để làm điều đó, bạn sử dụng một loại luồng đặc biệt gọi là luồng daemon.

Theo định nghĩa, các luồng daemon là các luồng chạy ở chế độ nền. Nói cách khác, các luồng daemon thực hiện các tác vụ ở chế độ nền.

Bài viết này được đăng tại [free tuts .net]

Các luồng daemon rất hữu ích cho việc thực hiện các tác vụ hỗ trợ cho các luồng không phải daemon trong chương trình. Ví dụ:

  • Ghi log thông tin vào một tệp ở chế độ nền.
  • Thu thập nội dung từ một trang web ở chế độ nền.
  • Tự động lưu dữ liệu vào cơ sở dữ liệu ở chế độ nền.

Tạo một luồng daemon trong Python

Để tạo một luồng daemon, bạn đặt thuộc tính daemon thành True trong hàm khởi tạo Thread:

t = Thread(target=f, daemon=True)

Hoặc, bạn có thể đặt thuộc tính daemon thành True sau khi tạo đối tượng Thread:

t = Thread(target=f)
t.daemon = True

Ví dụ về luồng daemon trong Python

Ví dụ sau đây cho thấy cách tạo một luồng không phải daemon để hiển thị số giây mà chương trình đã chờ:

from threading import Thread
import time

def show_timer():
    count = 0
    while True:
        count += 1
        time.sleep(1)
        print(f'Đã chờ {count} giây...')

t = Thread(target=show_timer)
t.start()

answer = input('Bạn có muốn thoát không?\n')

Cách hoạt động:

Đầu tiên, định nghĩa một hàm show_timer() để hiển thị số giây mà chương trình đã chờ.

Sau đó, tạo một luồng mới để thực thi hàm show_timer():

t = Thread(target=show_timer)

Tiếp theo, khởi động luồng:

t.start()

Cuối cùng, gọi hàm input() để nhắc người dùng nhập liệu:

answer = input('Bạn có muốn thoát không?\n')

Nếu bạn chạy chương trình, nó sẽ hiển thị kết quả sau và chạy mãi mãi:

Bạn có muốn thoát không?Đã chờ 1 giây...
Đã chờ 2 giây...
Đã chờ 3 giây...
Đã chờ 4 giây...
Y
Đã chờ 5 giây...
Đã chờ 6 giây...

Để kết thúc chương trình, bạn cần phải dừng terminal.

Chương trình chạy vô hạn vì luồng t là một luồng không phải daemon. Chương trình cần chờ tất cả các luồng không phải daemon hoàn thành trước khi thoát.

Bây giờ, hãy biến đổi luồng này thành một luồng daemon:

from threading import Thread
import time

def show_timer():
    count = 0
    while True:
        count += 1
        time.sleep(1)
        print(f'Đã chờ {count} giây...')

t = Thread(target=show_timer, daemon=True)
t.start()

answer = input('Bạn có muốn thoát không?\n')

Nếu bạn chạy chương trình, nhập liệu và nhấn enter, chương trình sẽ kết thúc. Ví dụ:

Bạn có muốn thoát không?
Đã chờ 1 giây...
Y

Chương trình kết thúc vì nó không cần chờ luồng daemon hoàn thành. Ngoài ra, luồng daemon sẽ tự động bị dừng khi chương trình thoát.

Sự khác biệt giữa luồng daemon và luồng không phải daemon trong Python

Bảng dưới đây minh họa sự khác biệt giữa luồng daemon và luồng không phải daemon:

Luồng Daemon Luồng Không Phải Daemon
Tạo luồng t = Thread(target=f, daemon=True)
Chương trình cần chờ trước khi thoát Không
Loại tác vụ

Không quan trọng như ghi log

Kết bài

Luồng daemon là một công cụ hữu ích trong Python để xử lý các tác vụ nền không quan trọng. Với khả năng tự động dừng khi chương trình chính kết thúc, luồng daemon giúp đảm bảo rằng các tài nguyên được giải phóng đúng cách và chương trình có thể thoát mà không cần chờ đợi. Điều này giúp tối ưu hóa hiệu suất và quản lý tài nguyên hiệu quả, đặc biệt là khi xử lý các tác vụ không quan trọng như ghi log, quét dữ liệu hoặc tự động lưu dữ liệu. Việc sử dụng luồng daemon đúng cách sẽ giúp bạn xây dựng các ứng dụng Python mạnh mẽ và hiệu quả hơn.

Cùng chuyên mục:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top