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

DDD
Lepaskan: 2024-11-10 17:20:03
asal
311 orang telah melayarinya

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()
Salin selepas log masuk

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()
Salin selepas log masuk

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()
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan