Python có thể sử dụng chủ đề không?

Tôi đang làm một dự án với python và trong mã của tôi, tôi phải bắt đầu một số chủ đề. Bây giờ tôi cần gọi một luồng để ngăn chặn nó, nhưng từ một lớp khác. Có cách nào để lấy danh sách tất cả các luồng đang chạy không?

Nội dung chính Hiển thị

Cảm ơn vì sự giúp đỡ

đã hỏi ngày 21 tháng 6 năm 2016 lúc 9. 24

1

Bạn có thể sử dụng luồng. liệt kê[]. Tài liệu Python về nó ở đây

for thread in threading.enumerate[]: 
    print[thread.name]

Anders

2.23210 huy hiệu bạc19 huy hiệu đồng

đã trả lời 21 tháng 6 năm 2016 lúc 10. 32

kaiser kaiser

8088 huy hiệu bạc11 huy hiệu đồng

2

xâu chuỗi. enumerate[] có thể được sử dụng để lấy danh sách các luồng đang chạy [Đối tượng luồng]. Theo tham chiếu thư viện, các luồng đang chạy ngụ ý

  1. Tất cả các đối tượng Chủ đề hiện đang hoạt động, được tạo bằng mô-đun luồng
  2. Chủ đề Daemonic [có sự hiện diện của nó không ngăn quá trình thoát]
  3. Các đối tượng luồng giả được tạo bởi luồng hiện tại [Các luồng được tạo trực tiếp từ mã C. Họ luôn sống và yêu tinh và không thể tham gia]
  4. Chủ đề chính [Chủ đề mặc định trong python]

Nó loại trừ các Chủ đề chưa bắt đầu và đã kết thúc

Bạn có thể sử dụng luồng. active_count để lấy độ dài của danh sách được trả về theo luồng. liệt kê

đã trả lời 9 tháng 4 năm 2019 lúc 7. 23

Nấm nho Nấm nho

3965 huy hiệu bạc12 huy hiệu đồng

Không phải là câu trả lời bạn đang tìm kiếm? . 7 hoặc đặt câu hỏi của riêng bạn

Nói chung, việc tắt các luồng đột ngột được coi là một cách lập trình tồi. Tắt một luồng đột ngột có thể để lại một tài nguyên quan trọng phải được đóng đúng cách, mở. Nhưng bạn có thể muốn hủy một luồng sau khi một khoảng thời gian cụ thể đã trôi qua hoặc một số ngắt đã được tạo. Có nhiều phương pháp khác nhau để bạn có thể giết một luồng trong python.
 

  • Tăng ngoại lệ trong chuỗi python
  • Đặt/Đặt lại cờ dừng
  • Sử dụng dấu vết để giết chủ đề
  • Sử dụng mô-đun đa xử lý để hủy các luồng
  • Giết luồng Python bằng cách đặt nó làm daemon
  • Sử dụng hàm ẩn _stop[]

Tăng ngoại lệ trong chuỗi python.
Phương thức này sử dụng hàm PyThreadState_SetAsyncExc[] để đưa ra một ngoại lệ trong luồng. Ví dụ: 
 

Python3

import threading

import ctypes

import time

class thread_with_exception[threading.Thread]:

    import0 import1import2import3

import4import5____12import7

import4import2threading0threading1 threading2

    import0 threading5____12threading7

import4threading9____10

import1import2 import3import0

import5import6import7import8 import9 import2ctypes1

import4ctypes3import0

import1import6______17ctypes8import7

    import0 import2import2threading7

import4import6 import7import7import2time0time1threading7

import1time4 import2time6

import4time8 time9class0class1 class2

import1import6 class5class6 import2import0

import5time4 time9

    import0 thread_with_exception[threading.Thread]:4import2threading7

import4thread_with_exception[threading.Thread]:8threading1 import2    1

import4    3threading1     5

    6    7

________ 14 ________ 16 ________ 100 ________ 101 ________ 10

import1    5import05import7

import1import6______17import10import7

import12threading1 import14import15import7

import17

import18import19____17

import21

import22

Khi chúng tôi chạy mã ở trên trong máy và bạn sẽ nhận thấy, ngay khi hàm raise_Exception[] được gọi, hàm đích run[] kết thúc. Điều này là do ngay khi một ngoại lệ được đưa ra, điều khiển chương trình sẽ nhảy ra khỏi khối thử và chức năng run[] bị chấm dứt. Sau đó, hàm join[] có thể được gọi để hủy luồng. Trong trường hợp không có hàm run_Exception[] thì hàm đích run[] cứ chạy mãi và hàm join[] không bao giờ được gọi để kết thúc luồng

  Đặt/Đặt lại cờ dừng.
Để giết một luồng, chúng ta có thể khai báo một cờ dừng và cờ này sẽ thỉnh thoảng được kiểm tra bởi luồng. Ví dụ

Python3

import threading

import time

import0 import28

    import2 import3import0

import4import6______17import36import7

import4import39 import40

import4import6 import43

import1____145

import40threading1 import48

import12threading1 import51threading1 import53

import17

import18import01____17

import40threading1 import3

import22

import6import7____164import7

Trong đoạn mã trên, ngay khi biến toàn cục stop_threads được đặt, hàm đích run[] kết thúc và luồng t1 có thể bị hủy bằng cách sử dụng t1. tham gia[]. Nhưng người ta có thể không sử dụng biến toàn cục vì một số lý do nhất định. Đối với những tình huống đó, các đối tượng chức năng có thể được chuyển để cung cấp chức năng tương tự như bên dưới.
 

Python3

import threading

import time

import0 import71

    import2 import3import0

import4import6______17import36import7

import4import6 import83

import5import45

import0 import87

import4import40threading1 import48

import4import12threading1 import51threading1 import97threading1______17threading00 threading01

import4import17

import4import18import01import7

import4import40threading1 import3

import4import22

import4import6______17import64import7

threading19

Đối tượng hàm được truyền trong đoạn mã trên luôn trả về giá trị của biến cục bộ stop_threads. Giá trị này được kiểm tra trong hàm run[] và ngay khi stop_threads được đặt lại, hàm run[] kết thúc và luồng có thể bị hủy

  Sử dụng dấu vết để hủy chuỗi.
Phương pháp này hoạt động bằng cách cài đặt dấu vết trong mỗi luồng. Mỗi dấu vết tự chấm dứt khi phát hiện một số kích thích hoặc cờ, do đó ngay lập tức giết chết luồng liên quan. Ví dụ

Python3

import threading21

import threading23

import threading

import time

class threading29

threading30import0 import1_______12time0threading35threading36threading35threading35threading39

    import5import2time0threading35threading36threading35threading35threading48

    import2____251____21 import48

threading30import0 threading56import2threading7

    import2____261threading1 import2threading64

    import2____264threading1 import2threading70

    threading72import2import7

threading30import0 threading77______12threading7

    threading81____12threading83

    import2____286

    import2____264threading1 import2threading61

threading30import0 threading95import2threading97

    import6 import00threading1threading1 import03import0

________ 105 ________ 64 ________ 12 ________ 108

    import10____10

________ 105 ________ 64 ________ 114

threading30import0 import17____12threading97

    import6 import2____123

import05import6 import00threading1threading1 import29import0

import4import32 import33

    time4 import2import08

threading30import0 import40import2threading7

    import2____251____21 import3

import0 import49

threading30import2 import3____10

    import6import7import36import7

import12threading1 import61______21 import63

import17

import18import19____17

import68

import22

import6 import71 import72

threading30import6______17import64import7

Trong mã này, start[] được sửa đổi một chút để đặt chức năng theo dõi hệ thống bằng cách sử dụng settrace[]. Chức năng theo dõi cục bộ được xác định sao cho, bất cứ khi nào cờ tiêu diệt [đã tắt] của chuỗi tương ứng được đặt, một ngoại lệ SystemExit sẽ được đưa ra khi thực thi dòng mã tiếp theo, kết thúc quá trình thực thi hàm đích func. Bây giờ chủ đề có thể bị giết bằng tham gia []

  Sử dụng mô-đun đa xử lý để loại bỏ luồng.
Mô-đun đa xử lý của Python cho phép bạn sinh ra các quy trình theo cách tương tự như cách bạn sinh ra các luồng bằng mô-đun luồng. Giao diện của mô-đun đa luồng tương tự như mô-đun phân luồng. Ví dụ: trong một mã nhất định, chúng tôi đã tạo ba luồng [quy trình] được tính từ 1 đến 9.

Python3

import threading

import time

import0 import83

    time8 import86class1 import88import7import01time0import92threading7

import4import18import96import7

import4import6______17ctypes01 import9 ctypes03ctypes04import9 ctypes06 import9 ctypes03ctypes09threading35ctypes11

time8 import86class1 import88import7import05time0ctypes19threading7

    class5threading1 import51threading1ctypes26threading1ctypes28

    ctypes30

Chức năng của đoạn mã trên cũng có thể được triển khai bằng cách sử dụng mô-đun đa xử lý theo cách tương tự, với rất ít thay đổi. Xem mã được đưa ra dưới đây.
 

Python3

import ctypes32

import time

import0 import83

    time8 import86class1 import88import7import01time0import92threading7

import4import18import96import7

import4import6______17ctypes54 import9 ctypes03ctypes04import9 ctypes06 import9 ctypes03ctypes09threading35ctypes11

time8 import86class1 import88import7import05time0ctypes19threading7

    ctypes75threading1 ctypes77threading1ctypes26threading1ctypes28

    ctypes83

Mặc dù giao diện của hai mô-đun tương tự nhau nhưng hai mô-đun có cách triển khai rất khác nhau. Tất cả các luồng chia sẻ các biến toàn cục, trong khi các quy trình hoàn toàn tách biệt với nhau. Do đó, quá trình tiêu diệt an toàn hơn nhiều so với tiêu diệt luồng. Lớp Process được cung cấp một phương thức, term[], để hủy một tiến trình. Bây giờ, trở lại vấn đề ban đầu. Giả sử trong đoạn mã trên, chúng tôi muốn hủy tất cả các quy trình sau 0. 03s đã trôi qua. Chức năng này đạt được bằng cách sử dụng mô-đun đa xử lý trong đoạn mã sau.
 

Python3

import ctypes32

import time

import0 import83

    time8 import86class1 import88import7import01time0import92threading7

import4import18import96import7

import4import6______17ctypes54 import9 ctypes03ctypes04import9 ctypes06 import9 ctypes03ctypes09threading35ctypes11

import18threading1 import20

time8 import86class1 import88import7import05time0ctypes19threading7

    ctypes75threading1 ctypes77threading1ctypes26threading1ctypes28

    ctypes83

    import41

import18import43import7

________ 68 ________ 475 ________ 71 ________ 148

    import50

Mặc dù hai mô-đun có cách triển khai khác nhau. Chức năng này được cung cấp bởi mô-đun đa xử lý trong đoạn mã trên tương tự như tiêu diệt luồng. Do đó, mô-đun đa xử lý có thể được sử dụng như một giải pháp thay thế đơn giản bất cứ khi nào chúng ta được yêu cầu thực hiện việc tiêu diệt các luồng trong Python

  Tắt luồng Python bằng cách đặt nó làm daemon.
Daemon thread là những thread bị hủy khi thoát khỏi chương trình chính. Ví dụ

Python3

import threading

import time

import threading21

import0 import49

    import2 import3import0

import4import18import65import7

import4import6______17import70import7

import12threading1 import51threading1import63

import17

import18import19____17

import81

Lưu ý rằng, luồng t1 vẫn tồn tại và ngăn chương trình chính thoát qua sys. lối ra[]. Trong Python, bất kỳ luồng không phải trình nền nào còn sống đều chặn chương trình chính để thoát. Trong khi đó, các luồng trình nền sẽ bị hủy ngay khi thoát khỏi chương trình chính. Nói cách khác, ngay sau khi thoát khỏi chương trình chính, tất cả các luồng daemon sẽ bị hủy. Để khai báo một luồng là daemon, chúng ta đặt đối số từ khóa, daemon là True. Ví dụ trong mã đã cho, nó thể hiện thuộc tính của chủ đề daemon.
 

Python3

import threading

import time

import threading21

import0 import49

    import2 import3import0

import4import18import65import7

import4import6______17time01import7

import12threading1 import51threading1import63

time08threading1 import3

import17

import18import19____17

import81

Lưu ý rằng, ngay sau khi thoát khỏi chương trình chính, luồng t1 sẽ bị hủy. Phương pháp này tỏ ra cực kỳ hữu ích trong trường hợp có thể sử dụng kết thúc chương trình để kích hoạt việc tiêu diệt luồng. Lưu ý rằng trong Python, chương trình chính kết thúc ngay khi tất cả các luồng không phải trình nền đã chết, bất kể số lượng luồng trình nền còn sống. Do đó, các tài nguyên được nắm giữ bởi các luồng daemon này, chẳng hạn như tệp đang mở, giao dịch cơ sở dữ liệu, v.v. có thể không được phát hành đúng cách. Luồng điều khiển ban đầu trong chương trình python không phải là luồng daemon. Việc giết một luồng bằng vũ lực không được khuyến nghị trừ khi nó được biết chắc chắn rằng làm như vậy sẽ không gây ra bất kỳ rò rỉ hoặc bế tắc nào.
Sử dụng hàm ẩn _stop[].
Để tắt một luồng, chúng tôi sử dụng chức năng ẩn _stop[] chức năng này không được ghi lại nhưng có thể biến mất trong phiên bản tiếp theo của python.
 

Python3

import time

import threading

class time21

    import0 import1import2time0threading35threading36threading35threading35time31

import4time33time34import2time36threading35threading36threading35threading35time41

Chủ Đề