Вопрос:

Python threading - Как многократно выполнить функцию в отдельном потоке?

python multithreading timer setinterval

1605 просмотра

5 ответа

472 Репутация автора

У меня есть этот код:

import threading
def printit():
  print ("Hello, World!")
  threading.Timer(1.0, printit).start()
threading.Timer(1.0, printit).start()

Я пытаюсь получить "Привет, мир!" печатается каждую секунду, однако, когда я запускаю код, ничего не происходит, процесс просто сохраняется.

Я читал посты, где именно этот код работал для людей.

Меня очень смущает, насколько сложно установить правильный интервал в python, так как я привык к JavaScript. Я чувствую, что что-то упустил.

Помощь приветствуется.

Автор: Jonas Bergner Источник Размещён: 01.01.2018 01:01

Ответы (5)


1 плюс

91 Репутация автора

Я запускаю его в Python 3.6.Он работает нормально, как вы ожидали.

Автор: Sigma65535 Размещён: 01.01.2018 01:07

2 плюса

30106 Репутация автора

Решение

Я не вижу никаких проблем с вашим текущим подходом. Это работает для меня в Python 2.7 и 3.4.5.

import threading

def printit():
    print ("Hello, World!")
    # threading.Timer(1.0, printit).start()
    #  ^ why you need this? However it works with it too

threading.Timer(1.0, printit).start()

который печатает:

Hello, World!
Hello, World!

Но я предлагаю начать тему как:

thread = threading.Timer(1.0, printit)
thread.start()

Так что вы можете остановить поток, используя:

thread.cancel()

Не имея объекта для Timerкласса, вам придется закрыть свой интерпретатор, чтобы остановить поток.


Альтернативный подход:

Лично я предпочитаю писать поток таймера, расширяя Threadкласс следующим образом:

from threading import Thread, Event

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

    def run(self):
        while not self.stopped.wait(0.5):
            print("Thread is running..")

Затем начните поток с объекта Eventкласса как:

my_event = Event()
thread = MyThread(my_event)
thread.start()

Вы начнете видеть следующий вывод на экране:

Thread is running..
Thread is running..
Thread is running..
Thread is running..

Чтобы остановить поток, выполните:

my_event.set()

Это обеспечивает большую гибкость при изменении изменений в будущем.

Автор: Moinuddin Quadri Размещён: 01.01.2018 01:10

1 плюс

149 Репутация автора

Попробуй это:

import time

def display():
    for i in range(1,5):
        time.sleep(1)
        print("hello world")
Автор: Ken Размещён: 01.01.2018 01:16

0 плюса

1 Репутация автора

Я использовал Python 3.6.0.
И я использовал _thread и время пакета.

import time
import _thread as t
def a(nothing=0):
    print('hi',nothing)
    time.sleep(1)
    t.start_new_thread(a,(nothing+1,))
t.start_new_thread(a,(1,))#first argument function name and second argument is tuple as a parameterlist.

о / п будет как
привет 1
привет 2
привет 3
....

Автор: MariMuthuKumar S Размещён: 01.01.2018 02:18

0 плюса

1455 Репутация автора

Проблема может заключаться в том, что вы создаете новый поток каждый раз, когда запускаете printit.

Лучшим способом может быть просто создать один поток, который будет делать то, что вы хотите, а затем отправить и событие, чтобы остановить его, когда он будет завершен по какой-то причине:

from threading import Thread,Event
from time import sleep

def threaded_function(evt):
    while True: # ie runs forever
        if evt.isSet():
            return()
        print "running"
        sleep(1)


if __name__ == "__main__":
    e=Event()
    thread = Thread(target = threaded_function, args = (e, ))
    thread.start()
    sleep(5)
    e.set() # tells the thread to exit
    thread.join()
    print "thread finished...exiting"
Автор: MortenSickel Размещён: 05.05.2019 08:39
Вопросы из категории :
32x32