Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `threading.Timer` Menimbulkan `RuntimeError` Apabila Berulangkali Dimulakan?

Mengapakah `threading.Timer` Menimbulkan `RuntimeError` Apabila Berulangkali Dimulakan?

DDD
DDDasal
2024-11-10 17:20:03308semak imbas

Why Does `threading.Timer` Raise a `RuntimeError` When Repeatedly Started?

Menelir dengan Pemasa Berulang

Untuk melaksanakan fungsi secara berkala setiap 'n' saat, kelas Python threading.Timer menawarkan penyelesaian praktikal . Walau bagaimanapun, menggunakan pemasa ini boleh menjadi rumit apabila anda perlu memulakan, menghentikan dan menetapkannya semula berulang kali.

Andaikan anda ingin menghidupkan fungsi setiap 0.5 saat. Anda boleh mencuba perkara berikut:

import threading

def function_to_execute():
    # Your function code here

t = threading.Timer(0.5, function_to_execute)

while True:
    t.cancel()
    t.start()

Walau bagaimanapun, kod ini akan menimbulkan RuntimeError, mengeluh tentang memulakan urutan lebih daripada sekali. Mengapa begitu?

Secara lalai, kaedah mula() bagi benang pemasa hanya boleh dipanggil sekali. Tetapi memandangkan kami membatalkan dan memulakan semula pemasa berulang kali, kami menghadapi masalah ini.

Mencipta Benang Pemasa Boleh Digunakan Semula

Untuk mengatasi had ini, pendekatan yang lebih baik ialah untuk memulakan benang pemasa sekali sahaja. Di dalam urutan, kami akan melaksanakan pelaksanaan fungsi berulang:

import threading

class MyThread(threading.Thread):
    def __init__(self, event):
        threading.Thread.__init__(self)
        self.stopped = event

    def run(self):
        while not self.stopped.wait(0.5):
            # Execute your function here

# Create a stop event
stopFlag = threading.Event()

# Start the timer thread
thread = MyThread(stopFlag)
thread.start()

Dengan persediaan ini, utas pemasa akan melaksanakan fungsi secara berterusan setiap 0.5 saat. Untuk menghentikan pemasa, hanya tetapkan acara stopFlag:

# Stop the timer
stopFlag.set()

Menggunakan kaedah ini, anda boleh berulang kali memulakan, menghentikan dan menetapkan semula pemasa mengikut keperluan, tanpa menghadapi RuntimeError.

Atas ialah kandungan terperinci Mengapakah `threading.Timer` Menimbulkan `RuntimeError` Apabila Berulangkali Dimulakan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn