Bạn có thể dừng một chuỗi trong python không?

Đây là một trong những câu hỏi thường gặp nhất trong Python. Vì vậy, trong bài viết này, chúng tôi sẽ giải quyết vấn đề này và đảm bảo bạn hiểu rõ về chủ đề này. Trước khi trực tiếp đi sâu vào chủ đề, chúng ta sẽ xem xét ngắn gọn về chuỗi và sau đó chuyển sang câu hỏi quan trọng về sứ mệnh của chúng ta. Vì vậy, không chậm trễ hơn nữa, hãy để các trò chơi bắt đầu. ?

Giới thiệu

Cái gì là Chủ đề ?

Theo Wikipedia, trong khoa học máy tính, luồng thực thi là chuỗi hướng dẫn được lập trình nhỏ nhất có thể được quản lý độc lập bởi bộ lập lịch biểu, thường là một phần của hệ điều hành

➽ Nhiều luồng có thể chạy đồng thời trong một chương trình. Ví dụ: trong trình xử lý văn bản, luồng nền có thể được sử dụng để kiểm tra chính tả trong khi luồng nền trước có thể được sử dụng để xử lý đầu vào của người dùng (tổ hợp phím), trong khi luồng thứ ba có thể được sử dụng để tải hình ảnh từ ổ cứng và một

  • Do đó, luồng trong Python được sử dụng để chạy nhiều luồng có thể là tác vụ hoặc lời gọi hàm cùng một lúc. Xin lưu ý rằng điều này không có nghĩa là nhiều luồng được thực thi trên các CPU khác nhau
  • Chuỗi Python không làm cho chương trình nhanh hơn trong trường hợp nó đã sử dụng 100 % thời gian CPU. Đó có lẽ là một phần của lập trình song song không nằm trong phạm vi của cuộc thảo luận này

Ghi chú. Luồng trong Python tự nó là một chủ đề thảo luận. Mục đích của phần giới thiệu này là để bạn làm quen với ý tưởng về chủ đề. Chúng tôi khuyên bạn nên có một số hiểu biết về luồng trong Python trước khi đi sâu vào chủ đề giết luồng

➥ Khi nào chúng ta sử dụng Threading trong Python?

Các luồng trong Python được sử dụng trong các tình huống khi việc thực thi một tác vụ hoặc lệnh gọi hàm liên quan đến việc chờ đợi. Một ví dụ có thể là tương tác với dịch vụ được lưu trữ trên máy chủ web. Do đó, luồng cho phép Python thực thi mã khác trong khi chờ đợi.  

➥ Ví dụ

import threading
import time

print("Printing values from 90 to 100: ")
def loop_thread():
    for t in range(90, 101):
        time.sleep(1)
        print(t)

threading.Thread(target=loop_thread).start()

đầu ra

Printing values from 90 to 100: 
90
91
92
93
94
95
96
97
98
99
100

Bây giờ chúng ta đã có cái nhìn tổng quan về các chủ đề, chúng ta hãy đi sâu vào câu hỏi quan trọng về nhiệm vụ của chúng ta

Các cách Tắt một luồng Bằng Python

Nói một cách đơn giản, giết một luồng đột ngột là một cách làm rất tồi trừ khi thực sự cần thiết. Phải nói rằng, bạn có thể muốn giết một luồng sau một khoảng thời gian nhất định hoặc sau một số lần ngắt. Vì vậy, thay vì đóng nó một cách cưỡng bức, bạn có thể vui lòng yêu cầu chuỗi đó biến mất sau khi đảm bảo dọn dẹp đúng cách, điều đó có nghĩa là

  • Chuỗi bạn đang cố hủy có thể đang nắm giữ một tài nguyên quan trọng phải được đóng đúng cách
  • Chuỗi có thể đã tạo ra một số chuỗi khác cũng phải bị hủy trước khi chuỗi gốc có thể bị hủy

Hãy để chúng tôi hiểu nhiều cách giúp chúng tôi làm điều đó

Phương pháp 1. Tạo một Cờ yêu cầu thoát

Nếu bạn là người quản lý các luồng của riêng mình, một cách hay để xử lý việc chấm dứt luồng là tạo một cờ thoát mà mỗi luồng sẽ kiểm tra định kỳ để biết liệu đã đến lúc thoát chưa

Thí dụ

import threading 
import time 
  
def thread_foo(stop):
    while True: 
        print("THREAD STILL RUNNING!") 
        if exit_flag: 
            break

exit_flag = False
t = threading.Thread(target = thread_foo, args =(lambda : exit_flag, )) 
t.start() 
time.sleep(0.1) 
print('Done sleeping! Time to stop the threads.')
exit_flag = True
t.join() 
print('THREAD TERMINATED!')

đầu ra

Bạn có thể dừng một chuỗi trong python không?

Trong ví dụ trên, chúng ta đã tạo một hàm tiếp tục thực thi luồng cho đến khi chương trình gặp biến

Printing values from 90 to 100: 
90
91
92
93
94
95
96
97
98
99
100
2. Ngay khi điều đó xảy ra, luồng có thể bị hủy bằng phương pháp
Printing values from 90 to 100: 
90
91
92
93
94
95
96
97
98
99
100
3

Lưu ý.

Printing values from 90 to 100: 
90
91
92
93
94
95
96
97
98
99
100
4 khiến luồng chính chờ luồng của bạn hoàn tất thực thi. Nói cách khác,
Printing values from 90 to 100: 
90
91
92
93
94
95
96
97
98
99
100
4 hoạt động như một “hold” trên luồng chính. Nó đảm bảo rằng luồng của bạn đã hoàn thành việc thực thi trước khi luồng chính có thể di chuyển về phía trước. Theo một cách nào đó, nó đảm bảo chấm dứt chủ đề của bạn sạch sẽ và đúng cách.

Phương pháp 2. Sử dụng Mô-đun đa xử lý

Như đã nêu trong tài liệu Python,

import threading 
import time 
  
def thread_foo(stop):
    while True: 
        print("THREAD STILL RUNNING!") 
        if exit_flag: 
            break

exit_flag = False
t = threading.Thread(target = thread_foo, args =(lambda : exit_flag, )) 
t.start() 
time.sleep(0.1) 
print('Done sleeping! Time to stop the threads.')
exit_flag = True
t.join() 
print('THREAD TERMINATED!')
4 là một gói hỗ trợ các quy trình sinh sản bằng API tương tự như mô-đun 
Printing values from 90 to 100: 
90
91
92
93
94
95
96
97
98
99
100
7. Ngoài ra, việc hủy một quy trình an toàn hơn nhiều so với việc hủy một luồng vì các luồng chia sẻ các biến toàn cục và có sự phụ thuộc, trong khi các quy trình hoàn toàn độc lập và tồn tại tách biệt với nhau. Mô-đun
import threading 
import time 
  
def thread_foo(stop):
    while True: 
        print("THREAD STILL RUNNING!") 
        if exit_flag: 
            break

exit_flag = False
t = threading.Thread(target = thread_foo, args =(lambda : exit_flag, )) 
t.start() 
time.sleep(0.1) 
print('Done sleeping! Time to stop the threads.')
exit_flag = True
t.join() 
print('THREAD TERMINATED!')
4 có chức năng
Printing values from 90 to 100: 
90
91
92
93
94
95
96
97
98
99
100
9 được sử dụng để giết một tiến trình

Chúng ta hãy xem ví dụ sau được đưa ra bên dưới để hiểu cách chúng ta có thể sử dụng mô-đun

import threading 
import time 
  
def thread_foo(stop):
    while True: 
        print("THREAD STILL RUNNING!") 
        if exit_flag: 
            break

exit_flag = False
t = threading.Thread(target = thread_foo, args =(lambda : exit_flag, )) 
t.start() 
time.sleep(0.1) 
print('Done sleeping! Time to stop the threads.')
exit_flag = True
t.join() 
print('THREAD TERMINATED!')
4 để hủy quy trình

import multiprocessing
import time
def Child_process():
  while True:
   for i in range (20):  
    print ('Process: ', i)
    time.sleep(0.05)
t = multiprocessing.Process(target = Child_process)
t.start()
time.sleep(0.5)
t.terminate()
print("Child Process successfully terminated")

đầu ra

Printing values from 90 to 100: 
90
91
92
93
94
95
96
97
98
99
100
0

Trong ví dụ trên sau 0. 5 giây việc thực thi của

import threading 
import time 
  
def thread_foo(stop):
    while True: 
        print("THREAD STILL RUNNING!") 
        if exit_flag: 
            break

exit_flag = False
t = threading.Thread(target = thread_foo, args =(lambda : exit_flag, )) 
t.start() 
time.sleep(0.1) 
print('Done sleeping! Time to stop the threads.')
exit_flag = True
t.join() 
print('THREAD TERMINATED!')
1 đã bị chấm dứt bằng cách sử dụng hàm
import threading 
import time 
  
def thread_foo(stop):
    while True: 
        print("THREAD STILL RUNNING!") 
        if exit_flag: 
            break

exit_flag = False
t = threading.Thread(target = thread_foo, args =(lambda : exit_flag, )) 
t.start() 
time.sleep(0.1) 
print('Done sleeping! Time to stop the threads.')
exit_flag = True
t.join() 
print('THREAD TERMINATED!')
2

Phương pháp 3. Sử dụng Mô-đun theo dõi

Một cách tiếp cận khác để giết một luồng là cài đặt

Printing values from 90 to 100: 
90
91
92
93
94
95
96
97
98
99
100
0 vào luồng sẽ thoát khỏi luồng.  

Mô-đun được cung cấp bên dưới cho phép bạn hủy các chủ đề. Lớp

import threading 
import time 
  
def thread_foo(stop):
    while True: 
        print("THREAD STILL RUNNING!") 
        if exit_flag: 
            break

exit_flag = False
t = threading.Thread(target = thread_foo, args =(lambda : exit_flag, )) 
t.start() 
time.sleep(0.1) 
print('Done sleeping! Time to stop the threads.')
exit_flag = True
t.join() 
print('THREAD TERMINATED!')
4 là sự thay thế tạm thời cho
import threading 
import time 
  
def thread_foo(stop):
    while True: 
        print("THREAD STILL RUNNING!") 
        if exit_flag: 
            break

exit_flag = False
t = threading.Thread(target = thread_foo, args =(lambda : exit_flag, )) 
t.start() 
time.sleep(0.1) 
print('Done sleeping! Time to stop the threads.')
exit_flag = True
t.join() 
print('THREAD TERMINATED!')
5. Nó thêm phương thức
import threading 
import time 
  
def thread_foo(stop):
    while True: 
        print("THREAD STILL RUNNING!") 
        if exit_flag: 
            break

exit_flag = False
t = threading.Thread(target = thread_foo, args =(lambda : exit_flag, )) 
t.start() 
time.sleep(0.1) 
print('Done sleeping! Time to stop the threads.')
exit_flag = True
t.join() 
print('THREAD TERMINATED!')
6, phương thức này sẽ dừng hầu hết các luồng trong đường đi của chúng

Tuyên bố từ chối trách nhiệm. Quy trình đưa ra dưới đây đã được lấy từ tài nguyên sau. Tắt chuỗi trong Python

KThread. py. Một triển khai Chủ đề có thể giết được

Printing values from 90 to 100: 
90
91
92
93
94
95
96
97
98
99
100
7

đầu ra

Printing values from 90 to 100: 
90
91
92
93
94
95
96
97
98
99
100
8

Phương pháp 4. Sử dụng ctypes Để tăng ngoại lệ trong chuỗi

Trong trường hợp khi bạn cần phải giết một luồng một cách cưỡng bức, ví dụ, trong khi gói một thư viện bên ngoài đang bận cho các cuộc gọi dài và bạn muốn làm gián đoạn nó, bạn có thể sử dụng raise_exc() để đưa ra một ngoại lệ tùy ý hoặc gọi term() tới . Nó sử dụng hàm PyThreadState_SetAsyncExc chưa được hiển thị (thông qua ctypes) để đưa ra một ngoại lệ trong ngữ cảnh của chuỗi đã cho.  

Đoạn mã sau cho phép (với một số hạn chế) đưa ra Ngoại lệ trong chuỗi Python

Thí dụ

Printing values from 90 to 100: 
90
91
92
93
94
95
96
97
98
99
100
9

đầu ra

import threading 
import time 
  
def thread_foo(stop):
    while True: 
        print("THREAD STILL RUNNING!") 
        if exit_flag: 
            break

exit_flag = False
t = threading.Thread(target = thread_foo, args =(lambda : exit_flag, )) 
t.start() 
time.sleep(0.1) 
print('Done sleeping! Time to stop the threads.')
exit_flag = True
t.join() 
print('THREAD TERMINATED!')
0

Sự kết luận

Những điểm chính rút ra từ bài viết này là

  • Chủ đề là gì?
  • Các cách để giết một luồng trong Python
    • Tạo cờ Exit_Request
    • Sử dụng Mô-đun
      import threading 
      import time 
        
      def thread_foo(stop):
          while True: 
              print("THREAD STILL RUNNING!") 
              if exit_flag: 
                  break
      
      exit_flag = False
      t = threading.Thread(target = thread_foo, args =(lambda : exit_flag, )) 
      t.start() 
      time.sleep(0.1) 
      print('Done sleeping! Time to stop the threads.')
      exit_flag = True
      t.join() 
      print('THREAD TERMINATED!')
      7
    • Sử dụng Mô-đun
      Printing values from 90 to 100: 
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      0
    • Sử dụng
      Printing values from 90 to 100: 
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      1 để tăng Ngoại lệ trong chuỗi

Hãy đăng ký và theo dõi để có nhiều bài viết thú vị hơn

Người giới thiệu

  1. https. // stackoverflow. com/câu hỏi/323972/là-có-bất-cứ-cách-giết-một-chuỗi
  2. http. // thông tin mạng. com/trăn/iq/giết. htm
  3. https. //pybay. com/site_media/slides/raymond2017-keynote/threading. html
  4. http. //tomerfiliba. com/công thức nấu ăn/Thread2/

hài hước mọt sách

Bạn có thể dừng một chuỗi trong python không?
Ồ vâng, tôi thậm chí còn không biết họ đã đổi tên nó thành Tháp Willis vào năm 2009, bởi vì tôi biết một chút về các tòa nhà chọc trời. — xkcd (nguồn)

Đi đâu từ đây?

Đủ lý thuyết. Hãy thực hành một số

Các lập trình viên được trả sáu con số trở lên vì họ có thể giải quyết vấn đề hiệu quả hơn bằng cách sử dụng trí thông minh máy móc và tự động hóa

Để trở nên thành công hơn trong việc viết mã, hãy giải quyết nhiều vấn đề thực tế hơn cho người thực. Đó là cách bạn trau dồi những kỹ năng bạn thực sự cần trong thực tế. Rốt cuộc, việc sử dụng lý thuyết học tập mà không ai cần là gì?

Bạn xây dựng các kỹ năng mã hóa có giá trị cao bằng cách làm việc trên các dự án mã hóa thực tế

Bạn có muốn ngừng học với các dự án đồ chơi và tập trung vào các dự án mã thực tế giúp bạn kiếm tiền và giải quyết các vấn đề thực sự cho mọi người không?

🚀 Nếu câu trả lời của bạn là CÓ. , cân nhắc trở thành nhà phát triển Python tự do. Đó là cách tốt nhất để tiếp cận nhiệm vụ cải thiện kỹ năng Python của bạn—ngay cả khi bạn là người hoàn toàn mới bắt đầu

Nếu bạn chỉ muốn tìm hiểu về cơ hội làm việc tự do, vui lòng xem hội thảo trên web miễn phí của tôi “Cách xây dựng kỹ năng Python có thu nhập cao của bạn” và tìm hiểu cách tôi phát triển công việc viết mã của mình trực tuyến cũng như cách bạn có thể làm được—từ sự thoải mái của bạn

Tham gia hội thảo trên web miễn phí ngay bây giờ

Bạn có thể dừng một chuỗi trong python không?

Shubham Sayon

Tôi là một người tạo nội dung và Blogger Python chuyên nghiệp. Tôi đã xuất bản nhiều bài báo và tạo các khóa học trong một khoảng thời gian. Hiện tại tôi đang làm việc với tư cách là một freelancer toàn thời gian và tôi có kinh nghiệm trong các lĩnh vực như Python, AWS, DevOps và Networking

Bạn có thể giết một chuỗi Python không?

Một luồng Python có thể bị hủy bằng cách hủy tiến trình mẹ của nó bên ngoài chương trình . Điều này có thể đạt được bằng cách gửi tín hiệu đến quy trình gốc.

Bạn có thể tạm dừng một chuỗi trong Python không?

Bạn có thể tạm dừng chủ đề Python không? . Khi đối tượng luồng gọi phương thức bắt đầu, nó chỉ có thể đợi cho đến khi chức năng phương thức tương ứng hoàn thành. the module does not provide methods for suspending, resuming and stopping threads. Once the thread object calls the start method, it can only wait until the corresponding method function is completed.