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ụ ý
- Tất cả các đối tượng Chủ đề hiện đang hoạt động, được tạo bằng mô-đun luồng
- Chủ đề Daemonic [có sự hiện diện của nó không ngăn quá trình thoát]
- 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]
- 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]:
import
0 import
1import
2import
3
import
4import
5____12import
7
import
4import
2threading
0threading
1 threading
2
import
0 threading
5____12threading
7
import
4threading
9____10
import
1import
2 import
3import
0
import
5import
6import
7import
8 import
9 import
2ctypes
1
import
4ctypes
3import
0
import
1import
6______17ctypes
8import
7
import
0 import
2import
2threading
7
import
4import
6 import
7import
7import
2time
0time
1threading
7
import
1time
4 import
2time
6
import
4time
8 time
9class
0class
1 class
2
import
1import
6 class
5class
6 import
2import
0
import
5time
4 time
9
import
0 thread_with_exception[threading.Thread]:
4import
2threading
7
import
4thread_with_exception[threading.Thread]:
8threading
1 import
2
1
import
4
3threading
1
5
6
7
________ 14 ________ 16 ________ 100 ________ 101 ________ 10
import
1
5import
05import
7
import
1import
6______17import
10import
7
import
12threading
1 import
14import
15import
7
import
17
import
18import
19____17
import
21
import
22
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
import
0 import
28
import
2 import
3import
0
import
4import
6______17import
36import
7
import
4import
39 import
40
import
4import
6 import
43
import
1____145
import
40threading
1 import
48
import
12threading
1 import
51threading
1 import
53
import
17
import
18import
01____17
import
40threading
1 import
3
import
22
import
6import
7____164import
7
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
import
0 import
71
import
2 import
3import
0
import
4import
6______17import
36import
7
import
4import
6 import
83
import
5import
45
import
0 import
87
import
4import
40threading
1 import
48
import
4import
12threading
1 import
51threading
1 import
97threading
1______17threading
00 threading
01
import
4import
17
import
4import
18import
01import
7
import
4import
40threading
1 import
3
import
4import
22
import
4import
6______17import
64import
7
threading
19
Đố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
threading
21
import
threading
23
import
threading
import
time
class
threading
29
threading
30import
0 import
1_______12time
0threading
35threading
36threading
35threading
35threading
39
import
5import
2time
0threading
35threading
36threading
35threading
35threading
48
import
2____251____21 import
48
threading
30import
0 threading
56import
2threading
7
import
2____261threading
1 import
2threading
64
import
2____264threading
1 import
2threading
70
threading
72import
2import
7
threading
30import
0 threading
77______12threading
7
threading
81____12threading
83
import
2____286
import
2____264threading
1 import
2threading
61
threading
30import
0 threading
95import
2threading
97
import
6 import
00threading
1threading
1 import
03import
0
________ 105 ________ 64 ________ 12 ________ 108
import
10____10
________ 105 ________ 64 ________ 114
threading
30import
0 import
17____12threading
97
import
6 import
2____123
import
05import
6 import
00threading
1threading
1 import
29import
0
import
4import
32 import
33
time
4 import
2import
08
threading
30import
0 import
40import
2threading
7
import
2____251____21 import
3
import
0 import
49
threading
30import
2 import
3____10
import
6import
7import
36import
7
import
12threading
1 import
61______21 import
63
import
17
import
18import
19____17
import
68
import
22
import
6 import
71 import
72
threading
30import
6______17import
64import
7
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
import
0 import
83
time
8 import
86class
1 import
88import
7import
01time
0import
92threading
7
import
4import
18import
96import
7
import
4import
6______17ctypes
01 import
9 ctypes
03ctypes
04import
9 ctypes
06 import
9 ctypes
03ctypes
09threading
35ctypes
11
time
8 import
86class
1 import
88import
7import
05time
0ctypes
19threading
7
class
5threading
1 import
51threading
1ctypes
26threading
1ctypes
28
ctypes
30
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
ctypes
32
import
time
import
0 import
83
time
8 import
86class
1 import
88import
7import
01time
0import
92threading
7
import
4import
18import
96import
7
import
4import
6______17ctypes
54 import
9 ctypes
03ctypes
04import
9 ctypes
06 import
9 ctypes
03ctypes
09threading
35ctypes
11
time
8 import
86class
1 import
88import
7import
05time
0ctypes
19threading
7
ctypes
75threading
1 ctypes
77threading
1ctypes
26threading
1ctypes
28
ctypes
83
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
ctypes
32
import
time
import
0 import
83
time
8 import
86class
1 import
88import
7import
01time
0import
92threading
7
import
4import
18import
96import
7
import
4import
6______17ctypes
54 import
9 ctypes
03ctypes
04import
9 ctypes
06 import
9 ctypes
03ctypes
09threading
35ctypes
11
import
18threading
1 import
20
time
8 import
86class
1 import
88import
7import
05time
0ctypes
19threading
7
ctypes
75threading
1 ctypes
77threading
1ctypes
26threading
1ctypes
28
ctypes
83
import
41
import
18import
43import
7
________ 68 ________ 475 ________ 71 ________ 148
import
50
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
threading
21
import
0 import
49
import
2 import
3import
0
import
4import
18import
65import
7
import
4import
6______17import
70import
7
import
12threading
1 import
51threading
1import
63
import
17
import
18import
19____17
import
81
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
threading
21
import
0 import
49
import
2 import
3import
0
import
4import
18import
65import
7
import
4import
6______17time
01import
7
import
12threading
1 import
51threading
1import
63
time
08threading
1 import
3
import
17
import
18import
19____17
import
81
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
time
21
import
0 import
1import
2time
0threading
35threading
36threading
35threading
35time
31
import
4time
33time
34import
2time
36threading
35threading
36threading
35threading
35time
41