Hướng dẫn run function every second python - chức năng chạy mỗi giây python

Nếu chương trình của bạn chưa có vòng lặp sự kiện, hãy sử dụng mô -đun lịch trình, thực hiện Trình lập lịch sự kiện có mục đích chung.

import sched, time
s = sched.scheduler(time.time, time.sleep)
def do_something(sc): 
    print("Doing stuff...")
    # do your stuff
    sc.enter(60, 1, do_something, (sc,))

s.enter(60, 1, do_something, (s,))
s.run()

Nếu bạn đã sử dụng thư viện vòng lặp sự kiện như

from threading import Timer

class RepeatedTimer(object):
    def __init__(self, interval, function, *args, **kwargs):
        self._timer     = None
        self.interval   = interval
        self.function   = function
        self.args       = args
        self.kwargs     = kwargs
        self.is_running = False
        self.start()

    def _run(self):
        self.is_running = False
        self.start()
        self.function(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            self._timer = Timer(self.interval, self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False
7,
from threading import Timer

class RepeatedTimer(object):
    def __init__(self, interval, function, *args, **kwargs):
        self._timer     = None
        self.interval   = interval
        self.function   = function
        self.args       = args
        self.kwargs     = kwargs
        self.is_running = False
        self.start()

    def _run(self):
        self.is_running = False
        self.start()
        self.function(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            self._timer = Timer(self.interval, self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False
8,
from threading import Timer

class RepeatedTimer(object):
    def __init__(self, interval, function, *args, **kwargs):
        self._timer     = None
        self.interval   = interval
        self.function   = function
        self.args       = args
        self.kwargs     = kwargs
        self.is_running = False
        self.start()

    def _run(self):
        self.is_running = False
        self.start()
        self.function(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            self._timer = Timer(self.interval, self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False
9,
from time import sleep

def hello(name):
    print "Hello %s!" % name

print "starting..."
rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
try:
    sleep(5) # your long-running job goes here...
finally:
    rt.stop() # better in a try/finally block to make sure the program ends!
0,
from time import sleep

def hello(name):
    print "Hello %s!" % name

print "starting..."
rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
try:
    sleep(5) # your long-running job goes here...
finally:
    rt.stop() # better in a try/finally block to make sure the program ends!
1,
from time import sleep

def hello(name):
    print "Hello %s!" % name

print "starting..."
rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
try:
    sleep(5) # your long-running job goes here...
finally:
    rt.stop() # better in a try/finally block to make sure the program ends!
2 và nhiều người khác - thay vào đó, hãy lên lịch cho nhiệm vụ bằng các phương thức của Thư viện Loop Event hiện tại của bạn.

Đã trả lời ngày 23 tháng 1 năm 2009 lúc 21:09Jan 23, 2009 at 21:09

Hướng dẫn run function every second python - chức năng chạy mỗi giây python

25

Khóa vòng lặp thời gian của bạn vào đồng hồ hệ thống như thế này:

import time
starttime = time.time()
while True:
    print("tick")
    time.sleep(60.0 - ((time.time() - starttime) % 60.0))

Hướng dẫn run function every second python - chức năng chạy mỗi giây python

Martineau

Huy hiệu vàng 116K2525 gold badges161 silver badges288 bronze badges

Đã trả lời ngày 11 tháng 8 năm 2014 lúc 20:25Aug 11, 2014 at 20:25

Dave Rovedave RoveDave Rove

3,5531 Huy hiệu vàng13 Huy hiệu bạc2 Huy hiệu đồng1 gold badge13 silver badges2 bronze badges

18

Nếu bạn muốn một cách không chặn để thực hiện chức năng của mình theo định kỳ, thay vì một vòng lặp vô hạn chặn, tôi sẽ sử dụng bộ hẹn giờ có ren. Bằng cách này, mã của bạn có thể tiếp tục chạy và thực hiện các tác vụ khác mà vẫn có chức năng của bạn được gọi là mỗi giây. Tôi sử dụng kỹ thuật này rất nhiều để in thông tin tiến trình về các tác vụ chuyên sâu dài, CPU/Đĩa/mạng.

Đây là mã tôi đã đăng trong một câu hỏi tương tự, với điều khiển start () và stop ():

from threading import Timer

class RepeatedTimer(object):
    def __init__(self, interval, function, *args, **kwargs):
        self._timer     = None
        self.interval   = interval
        self.function   = function
        self.args       = args
        self.kwargs     = kwargs
        self.is_running = False
        self.start()

    def _run(self):
        self.is_running = False
        self.start()
        self.function(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            self._timer = Timer(self.interval, self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False

Usage:

from time import sleep

def hello(name):
    print "Hello %s!" % name

print "starting..."
rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
try:
    sleep(5) # your long-running job goes here...
finally:
    rt.stop() # better in a try/finally block to make sure the program ends!

Features:

  • Chỉ thư viện tiêu chuẩn, không phụ thuộc bên ngoài
  • from time import sleep
    
    def hello(name):
        print "Hello %s!" % name
    
    print "starting..."
    rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
    try:
        sleep(5) # your long-running job goes here...
    finally:
        rt.stop() # better in a try/finally block to make sure the program ends!
    
    3 và
    from time import sleep
    
    def hello(name):
        print "Hello %s!" % name
    
    print "starting..."
    rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
    try:
        sleep(5) # your long-running job goes here...
    finally:
        rt.stop() # better in a try/finally block to make sure the program ends!
    
    4 an toàn khi gọi nhiều lần ngay cả khi bộ hẹn giờ đã bắt đầu/dừng
  • chức năng được gọi là có thể có các đối số vị trí và được đặt tên
  • Bạn có thể thay đổi
    from time import sleep
    
    def hello(name):
        print "Hello %s!" % name
    
    print "starting..."
    rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
    try:
        sleep(5) # your long-running job goes here...
    finally:
        rt.stop() # better in a try/finally block to make sure the program ends!
    
    5 bất cứ lúc nào, nó sẽ có hiệu lực sau khi chạy tiếp theo. Tương tự cho
    from time import sleep
    
    def hello(name):
        print "Hello %s!" % name
    
    print "starting..."
    rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
    try:
        sleep(5) # your long-running job goes here...
    finally:
        rt.stop() # better in a try/finally block to make sure the program ends!
    
    6,
    from time import sleep
    
    def hello(name):
        print "Hello %s!" % name
    
    print "starting..."
    rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
    try:
        sleep(5) # your long-running job goes here...
    finally:
        rt.stop() # better in a try/finally block to make sure the program ends!
    
    7 và thậm chí
    from time import sleep
    
    def hello(name):
        print "Hello %s!" % name
    
    print "starting..."
    rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
    try:
        sleep(5) # your long-running job goes here...
    finally:
        rt.stop() # better in a try/finally block to make sure the program ends!
    
    8!

Đã trả lời ngày 11 tháng 7 năm 2016 lúc 22:15Jul 11, 2016 at 22:15

MestrelionmestrelionMestreLion

12.1k5 Huy hiệu vàng62 Huy hiệu bạc57 Huy hiệu Đồng5 gold badges62 silver badges57 bronze badges

6

Bạn có thể muốn xem xét Twisted, một thư viện mạng Python thực hiện mẫu lò phản ứng.

from twisted.internet import task, reactor

timeout = 60.0 # Sixty seconds

def doWork():
    #do work here
    pass

l = task.LoopingCall(doWork)
l.start(timeout) # call every sixty seconds

reactor.run()

Trong khi "trong khi đúng: giấc ngủ (60)" có thể sẽ hoạt động có lẽ đã thực hiện nhiều tính năng mà cuối cùng bạn sẽ cần (trình nền, đăng nhập hoặc xử lý ngoại lệ như được chỉ ra bởi Bobince) và có lẽ sẽ là một giải pháp mạnh mẽ hơn

Hướng dẫn run function every second python - chức năng chạy mỗi giây python

Đã trả lời ngày 23 tháng 1 năm 2009 lúc 21:14Jan 23, 2009 at 21:14

Hướng dẫn run function every second python - chức năng chạy mỗi giây python

Aaron Maenpaaaaron MaenpaaAaron Maenpaa

Huy hiệu vàng 117K1194 Huy hiệu bạc108 Huy hiệu đồng11 gold badges94 silver badges108 bronze badges

5

Đây là bản cập nhật cho mã từ Mestrelion tránh trôi theo thời gian.

Lớp lặp lại ở đây gọi hàm đã cho mỗi giây "khoảng" theo yêu cầu của OP; Lịch trình không phụ thuộc vào thời gian của chức năng để thực thi. Tôi thích giải pháp này vì nó không có phụ thuộc thư viện bên ngoài; Đây chỉ là Python thuần túy.

import threading 
import time

class RepeatedTimer(object):
  def __init__(self, interval, function, *args, **kwargs):
    self._timer = None
    self.interval = interval
    self.function = function
    self.args = args
    self.kwargs = kwargs
    self.is_running = False
    self.next_call = time.time()
    self.start()

  def _run(self):
    self.is_running = False
    self.start()
    self.function(*self.args, **self.kwargs)

  def start(self):
    if not self.is_running:
      self.next_call += self.interval
      self._timer = threading.Timer(self.next_call - time.time(), self._run)
      self._timer.start()
      self.is_running = True

  def stop(self):
    self._timer.cancel()
    self.is_running = False

Sử dụng mẫu (được sao chép từ câu trả lời của Mestrelion):

from time import sleep

def hello(name):
    print "Hello %s!" % name

print "starting..."
rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
try:
    sleep(5) # your long-running job goes here...
finally:
    rt.stop() # better in a try/finally block to make sure the program ends!

Đã trả lời ngày 5 tháng 12 năm 2016 lúc 0:22Dec 5, 2016 at 0:22

ERAOULREANOULeraoul

1.00311 huy hiệu bạc19 Huy hiệu đồng11 silver badges19 bronze badges

1

import time, traceback

def every(delay, task):
  next_time = time.time() + delay
  while True:
    time.sleep(max(0, next_time - time.time()))
    try:
      task()
    except Exception:
      traceback.print_exc()
      # in production code you might want to have this instead of course:
      # logger.exception("Problem while executing repetitive task.")
    # skip tasks if we are behind schedule:
    next_time += (time.time() - next_time) // delay * delay + delay

def foo():
  print("foo", time.time())

every(5, foo)

Nếu bạn muốn làm điều này mà không chặn mã còn lại của mình, bạn có thể sử dụng nó để cho nó chạy trong luồng của riêng mình:

import threading
threading.Thread(target=lambda: every(5, foo)).start()

Giải pháp này kết hợp một số tính năng hiếm khi được tìm thấy kết hợp trong các giải pháp khác:

  • Xử lý ngoại lệ: càng nhiều càng tốt ở cấp độ này, các trường hợp ngoại lệ được xử lý đúng, i. e. Được đăng nhập cho mục đích gỡ lỗi mà không hủy bỏ chương trình của chúng tôi. As far as possible on this level, exceptions are handled properly, i. e. get logged for debugging purposes without aborting our program.
  • Không có chuỗi: Việc triển khai giống như chuỗi chung (để lên lịch cho sự kiện tiếp theo) bạn tìm thấy trong nhiều câu trả lời là giòn ở khía cạnh nếu có bất cứ điều gì sai trong cơ chế lập lịch (
    from time import sleep
    
    def hello(name):
        print "Hello %s!" % name
    
    print "starting..."
    rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
    try:
        sleep(5) # your long-running job goes here...
    finally:
        rt.stop() # better in a try/finally block to make sure the program ends!
    
    9 hoặc bất cứ điều gì), điều này sẽ chấm dứt chuỗi. Không thực hiện thêm sẽ xảy ra sau đó, ngay cả khi lý do của vấn đề đã được khắc phục. Một vòng lặp đơn giản và chờ đợi với một
    from twisted.internet import task, reactor
    
    timeout = 60.0 # Sixty seconds
    
    def doWork():
        #do work here
        pass
    
    l = task.LoopingCall(doWork)
    l.start(timeout) # call every sixty seconds
    
    reactor.run()
    
    0 đơn giản là mạnh mẽ hơn nhiều so với.
    The common chain-like implementation (for scheduling the next event) you find in many answers is brittle in the aspect that if anything goes wrong within the scheduling mechanism (
    from time import sleep
    
    def hello(name):
        print "Hello %s!" % name
    
    print "starting..."
    rt = RepeatedTimer(1, hello, "World") # it auto-starts, no need of rt.start()
    try:
        sleep(5) # your long-running job goes here...
    finally:
        rt.stop() # better in a try/finally block to make sure the program ends!
    
    9 or whatever), this will terminate the chain. No further executions will happen then, even if the reason of the problem is already fixed. A simple loop and waiting with a simple
    from twisted.internet import task, reactor
    
    timeout = 60.0 # Sixty seconds
    
    def doWork():
        #do work here
        pass
    
    l = task.LoopingCall(doWork)
    l.start(timeout) # call every sixty seconds
    
    reactor.run()
    
    0 is much more robust in comparison.
  • Không có sự trôi dạt: Giải pháp của tôi giữ một bản nhạc chính xác về thời gian mà nó được cho là chạy tại. Không có sự trôi dạt nào tùy thuộc vào thời gian thực hiện (như trong nhiều giải pháp khác). My solution keeps an exact track of the times it is supposed to run at. There is no drift depending on the execution time (as in many other solutions).
  • Bỏ qua: Giải pháp của tôi sẽ bỏ qua các nhiệm vụ nếu một lần thực thi mất quá nhiều thời gian (e. G. Do x cứ sau năm giây, nhưng x mất 6 giây). Đây là hành vi cron tiêu chuẩn (và vì một lý do chính đáng). Nhiều giải pháp khác sau đó chỉ cần thực hiện nhiệm vụ nhiều lần liên tiếp mà không có bất kỳ sự chậm trễ nào. Đối với hầu hết các trường hợp (e. G. Nhiệm vụ dọn dẹp) Điều này không được chúc. Nếu nó được mong muốn, chỉ cần sử dụng
    from twisted.internet import task, reactor
    
    timeout = 60.0 # Sixty seconds
    
    def doWork():
        #do work here
        pass
    
    l = task.LoopingCall(doWork)
    l.start(timeout) # call every sixty seconds
    
    reactor.run()
    
    1 thay thế.
    My solution will skip tasks if one execution took too much time (e. g. do X every five seconds, but X took 6 seconds). This is the standard cron behavior (and for a good reason). Many other solutions then simply execute the task several times in a row without any delay. For most cases (e. g. cleanup tasks) this is not wished. If it is wished, simply use
    from twisted.internet import task, reactor
    
    timeout = 60.0 # Sixty seconds
    
    def doWork():
        #do work here
        pass
    
    l = task.LoopingCall(doWork)
    l.start(timeout) # call every sixty seconds
    
    reactor.run()
    
    1 instead.

Đã trả lời ngày 12 tháng 4 năm 2018 lúc 16:31Apr 12, 2018 at 16:31

Hướng dẫn run function every second python - chức năng chạy mỗi giây python

AlfealfeAlfe

53,9K19 Huy hiệu vàng100 Huy hiệu bạc154 Huy hiệu đồng19 gold badges100 silver badges154 bronze badges

9

Cách tôi tin là dễ dàng hơn:

import time

def executeSomething():
    #code here
    time.sleep(60)

while True:
    executeSomething()

Bằng cách này, mã của bạn được thực thi, sau đó nó chờ 60 giây sau đó nó thực hiện lại, chờ đợi, thực thi, v.v ... không cần phải làm phức tạp mọi thứ: D

Adrian p

6.4594 Huy hiệu vàng37 Huy hiệu bạc55 Huy hiệu Đồng4 gold badges37 silver badges55 bronze badges

Đã trả lời ngày 4 tháng 11 năm 2012 lúc 10:26Nov 4, 2012 at 10:26

ItxakaitxakaItxaka

7496 Huy hiệu bạc10 Huy hiệu đồng6 silver badges10 bronze badges

3

Tôi đã kết thúc bằng cách sử dụng mô -đun lịch trình. API là tốt đẹp.

import time
starttime = time.time()
while True:
    print("tick")
    time.sleep(60.0 - ((time.time() - starttime) % 60.0))
0

Đã trả lời ngày 5 tháng 12 năm 2019 lúc 21:44Dec 5, 2019 at 21:44

Liên minh tìm kiếmUnion find

7.36413 Huy hiệu vàng57 Huy hiệu bạc103 Huy hiệu Đồng13 gold badges57 silver badges103 bronze badges

3

Giải pháp linh hoạt thay thế là apscheduler.

import time
starttime = time.time()
while True:
    print("tick")
    time.sleep(60.0 - ((time.time() - starttime) % 60.0))
1
import time
starttime = time.time()
while True:
    print("tick")
    time.sleep(60.0 - ((time.time() - starttime) % 60.0))
2

Ngoài ra, Apscheduler cung cấp rất nhiều lịch trình như sau.

  • Chặnscheduler: Sử dụng khi bộ lập lịch là thứ duy nhất chạy trong quy trình của bạn

  • Backterscheduler: Sử dụng khi bạn không sử dụng bất kỳ khung nào bên dưới và muốn trình lập lịch chạy trong nền bên trong ứng dụng của bạn

  • Asyncioscheduler: Sử dụng nếu ứng dụng của bạn sử dụng mô -đun Asyncio

  • Geventscheduler: Sử dụng nếu ứng dụng của bạn sử dụng Gevent

  • Tornadoscheduler: Sử dụng nếu bạn đang xây dựng một ứng dụng Tornado

  • TwistedScheduler: Sử dụng nếu bạn đang xây dựng một ứng dụng xoắn

  • Qtscheduler: Sử dụng nếu bạn đang xây dựng một ứng dụng QT

Đã trả lời ngày 30 tháng 11 năm 2020 lúc 5:18Nov 30, 2020 at 5:18

Hướng dẫn run function every second python - chức năng chạy mỗi giây python

1

Tôi đã phải đối mặt với một vấn đề tương tự một thời gian trở lại. Có thể là http://cronus.readthedocs.org có thể giúp đỡ?

Đối với v0.2, đoạn trích sau đây hoạt động

import time
starttime = time.time()
while True:
    print("tick")
    time.sleep(60.0 - ((time.time() - starttime) % 60.0))
3

Đã trả lời ngày 6 tháng 6 năm 2014 lúc 18:21Jun 6, 2014 at 18:21

AnayanayAnay

2092 Huy hiệu bạc6 Huy hiệu Đồng2 silver badges6 bronze badges

Sự khác biệt chính giữa điều đó và Cron là một ngoại lệ sẽ giết chết daemon cho tốt. Bạn có thể muốn kết thúc với một người bắt và logger ngoại lệ.

Đã trả lời ngày 23 tháng 1 năm 2009 lúc 21:12Jan 23, 2009 at 21:12

Bobincebobincebobince

521K103 Huy hiệu vàng648 Huy hiệu bạc827 Huy hiệu Đồng103 gold badges648 silver badges827 bronze badges

Nếu trôi dạt không phải là một mối quan tâm

import time
starttime = time.time()
while True:
    print("tick")
    time.sleep(60.0 - ((time.time() - starttime) % 60.0))
4

Mà không đồng bộ hóa ra.

import time
starttime = time.time()
while True:
    print("tick")
    time.sleep(60.0 - ((time.time() - starttime) % 60.0))
5

Nếu nhiệm vụ được chạy mất một khoảng thời gian đáng kể, thì khoảng thời gian sẽ trở thành 2 giây + thời gian nhiệm vụ, vì vậy nếu bạn cần lập lịch chính xác thì điều này không dành cho bạn.

Lưu ý cờ

from twisted.internet import task, reactor

timeout = 60.0 # Sixty seconds

def doWork():
    #do work here
    pass

l = task.LoopingCall(doWork)
l.start(timeout) # call every sixty seconds

reactor.run()
2 có nghĩa là chủ đề này sẽ không chặn ứng dụng tắt. Ví dụ, đã có vấn đề trong đó
from twisted.internet import task, reactor

timeout = 60.0 # Sixty seconds

def doWork():
    #do work here
    pass

l = task.LoopingCall(doWork)
l.start(timeout) # call every sixty seconds

reactor.run()
3 sẽ treo vô thời hạn sau khi chạy các bài kiểm tra chờ đợi điều này chấm dứt.

Đã trả lời ngày 21 tháng 5 năm 2020 lúc 15:19May 21, 2020 at 15:19

Hướng dẫn run function every second python - chức năng chạy mỗi giây python

Adam Hughesadam HughesAdam Hughes

13.4K10 Huy hiệu vàng75 Huy hiệu bạc116 Huy hiệu đồng10 gold badges75 silver badges116 bronze badges

7

Đơn giản chỉ cần sử dụng

import time
starttime = time.time()
while True:
    print("tick")
    time.sleep(60.0 - ((time.time() - starttime) % 60.0))
6

Đã trả lời ngày 11 tháng 5 năm 2021 lúc 9:45May 11, 2021 at 9:45

Hướng dẫn run function every second python - chức năng chạy mỗi giây python

SwadeshiswadeshiSwadeshi

1.52620 huy hiệu bạc32 huy hiệu đồng20 silver badges32 bronze badges

1

Một câu trả lời có thể:

import time
starttime = time.time()
while True:
    print("tick")
    time.sleep(60.0 - ((time.time() - starttime) % 60.0))
7

Đã trả lời ngày 24 tháng 3 năm 2017 lúc 6:56Mar 24, 2017 at 6:56

sksskssks

1971 Huy hiệu vàng3 Huy hiệu bạc14 Huy hiệu đồng1 gold badge3 silver badges14 bronze badges

3

Tôi sử dụng phương thức tkinter sau (), không "đánh cắp trò chơi" (như mô -đun lịch trình được trình bày trước đó), tức là nó cho phép những thứ khác chạy song song:sched module that was presented earlier), i.e. it allows other things to run in parallel:

import time
starttime = time.time()
while True:
    print("tick")
    time.sleep(60.0 - ((time.time() - starttime) % 60.0))
8

from twisted.internet import task, reactor

timeout = 60.0 # Sixty seconds

def doWork():
    #do work here
    pass

l = task.LoopingCall(doWork)
l.start(timeout) # call every sixty seconds

reactor.run()
4 và
from twisted.internet import task, reactor

timeout = 60.0 # Sixty seconds

def doWork():
    #do work here
    pass

l = task.LoopingCall(doWork)
l.start(timeout) # call every sixty seconds

reactor.run()
5 có thể chạy song song và trong bất kỳ tốc độ khoảng thời gian nào. Ở đây, cái thứ 2 sẽ được thực thi nhanh gấp đôi. Cũng như tôi đã sử dụng một bộ đếm đơn giản làm điều kiện để chấm dứt một trong hai chức năng. Bạn có thể sử dụng bất kỳ cuộc tranh luận nào khác mà bạn thích hoặc không nếu bạn có chức năng chạy cho đến khi chương trình chấm dứt (ví dụ: đồng hồ).

Đã trả lời ngày 14 tháng 3 năm 2018 lúc 8:27Mar 14, 2018 at 8:27

ApostolosapostolosApostolos

2.91721 Huy hiệu bạc27 Huy hiệu đồng21 silver badges27 bronze badges

3

Đây là phiên bản thích nghi với mã từ Mestrelion. Ngoài chức năng gốc, mã này:

1) Thêm First_Interval được sử dụng để bắn bộ hẹn giờ tại một thời điểm cụ thể (người gọi cần tính toán First_interval và chuyển vào)

2) Giải quyết điều kiện chủng tộc trong mã gốc. Trong mã gốc, nếu luồng điều khiển không thể hủy bộ hẹn giờ đang chạy ("Dừng bộ đếm thời gian và hủy bỏ hành động của bộ hẹn giờ. Điều này sẽ chỉ hoạt động nếu bộ đếm thời gian vẫn đang trong giai đoạn chờ của nó." Được trích dẫn từ https: // docs.python.org/2/l Library/threading.html), bộ hẹn giờ sẽ chạy vô tận.

import time
starttime = time.time()
while True:
    print("tick")
    time.sleep(60.0 - ((time.time() - starttime) % 60.0))
9

Đã trả lời ngày 10 tháng 9 năm 2018 lúc 9:55Sep 10, 2018 at 9:55

DPROCDPROCdproc

716 Huy hiệu Đồng6 bronze badges

Đây là một giải pháp khác mà không cần sử dụng bất kỳ kẻ bất hợp pháp nào.

from threading import Timer

class RepeatedTimer(object):
    def __init__(self, interval, function, *args, **kwargs):
        self._timer     = None
        self.interval   = interval
        self.function   = function
        self.args       = args
        self.kwargs     = kwargs
        self.is_running = False
        self.start()

    def _run(self):
        self.is_running = False
        self.start()
        self.function(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            self._timer = Timer(self.interval, self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False
0

Đã trả lời ngày 20 tháng 5 năm 2020 lúc 17:49May 20, 2020 at 17:49

DATDATDat

4.8752 Huy hiệu vàng28 Huy hiệu bạc 30 Huy hiệu Đồng2 gold badges28 silver badges30 bronze badges

Tôi sử dụng điều này để gây ra 60 sự kiện mỗi giờ với hầu hết các sự kiện xảy ra với cùng một số giây sau toàn bộ phút:

from threading import Timer

class RepeatedTimer(object):
    def __init__(self, interval, function, *args, **kwargs):
        self._timer     = None
        self.interval   = interval
        self.function   = function
        self.args       = args
        self.kwargs     = kwargs
        self.is_running = False
        self.start()

    def _run(self):
        self.is_running = False
        self.start()
        self.function(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            self._timer = Timer(self.interval, self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False
1

Tùy thuộc vào điều kiện thực tế, bạn có thể nhận được ve có độ dài:

from threading import Timer

class RepeatedTimer(object):
    def __init__(self, interval, function, *args, **kwargs):
        self._timer     = None
        self.interval   = interval
        self.function   = function
        self.args       = args
        self.kwargs     = kwargs
        self.is_running = False
        self.start()

    def _run(self):
        self.is_running = False
        self.start()
        self.function(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            self._timer = Timer(self.interval, self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False
2

Nhưng vào cuối 60 phút, bạn sẽ có 60 ve; và hầu hết trong số họ sẽ xảy ra ở độ lệch chính xác đến phút bạn thích.

Trên hệ thống của tôi, tôi nhận được sự trôi dạt điển hình của <1/20 của một giây cho đến khi cần phải điều chỉnh.

Ưu điểm của phương pháp này là độ phân giải của sự trôi dạt đồng hồ; Điều này có thể gây ra các vấn đề nếu bạn đang làm những việc như nối thêm một mục mỗi lần đánh dấu và bạn mong đợi 60 mặt hàng được thêm vào mỗi giờ. Việc không tính đến sự trôi dạt có thể gây ra các chỉ dẫn thứ cấp như di chuyển trung bình để xem xét dữ liệu quá sâu vào quá khứ dẫn đến đầu ra bị lỗi.

Đã trả lời ngày 21 tháng 2 năm 2017 lúc 13:43Feb 21, 2017 at 13:43

litepresencelitepresencelitepresence

2.9831 Huy hiệu vàng26 Huy hiệu bạc35 Huy hiệu Đồng1 gold badge26 silver badges35 bronze badges

ví dụ: hiển thị giờ địa phương hiện tại

from threading import Timer

class RepeatedTimer(object):
    def __init__(self, interval, function, *args, **kwargs):
        self._timer     = None
        self.interval   = interval
        self.function   = function
        self.args       = args
        self.kwargs     = kwargs
        self.is_running = False
        self.start()

    def _run(self):
        self.is_running = False
        self.start()
        self.function(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            self._timer = Timer(self.interval, self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False
3

Đã trả lời ngày 29 tháng 9 năm 2017 lúc 18:13Sep 29, 2017 at 18:13

from threading import Timer

class RepeatedTimer(object):
    def __init__(self, interval, function, *args, **kwargs):
        self._timer     = None
        self.interval   = interval
        self.function   = function
        self.args       = args
        self.kwargs     = kwargs
        self.is_running = False
        self.start()

    def _run(self):
        self.is_running = False
        self.start()
        self.function(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            self._timer = Timer(self.interval, self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False
4

Đã trả lời ngày 28 tháng 8 năm 2018 lúc 10:59Aug 28, 2018 at 10:59

1

Tôi nghĩ rằng nó phụ thuộc vào những gì bạn muốn làm và câu hỏi của bạn không chỉ định nhiều chi tiết.

Đối với tôi, tôi muốn thực hiện một hoạt động đắt tiền trong một trong các quy trình đã đa luồng của tôi. Vì vậy, tôi có quy trình lãnh đạo đó kiểm tra thời gian và chỉ cô ấy làm OP đắt tiền (kiểm tra một mô hình học tập sâu). Để làm điều này, tôi tăng bộ đếm để đảm bảo 5 sau đó 10 sau đó 15 giây đã vượt qua để tiết kiệm sau mỗi 5 giây (hoặc sử dụng số học mô -đun với Math.Floor):

from threading import Timer

class RepeatedTimer(object):
    def __init__(self, interval, function, *args, **kwargs):
        self._timer     = None
        self.interval   = interval
        self.function   = function
        self.args       = args
        self.kwargs     = kwargs
        self.is_running = False
        self.start()

    def _run(self):
        self.is_running = False
        self.start()
        self.function(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            self._timer = Timer(self.interval, self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False
5
from threading import Timer

class RepeatedTimer(object):
    def __init__(self, interval, function, *args, **kwargs):
        self._timer     = None
        self.interval   = interval
        self.function   = function
        self.args       = args
        self.kwargs     = kwargs
        self.is_running = False
        self.start()

    def _run(self):
        self.is_running = False
        self.start()
        self.function(*self.args, **self.kwargs)

    def start(self):
        if not self.is_running:
            self._timer = Timer(self.interval, self._run)
            self._timer.start()
            self.is_running = True

    def stop(self):
        self._timer.cancel()
        self.is_running = False
6

Đối với tôi kiểm tra câu lệnh IF là những gì tôi cần.Có các chủ đề, bộ lập lịch trong mã đa GPU đa biến đã phức tạp của tôi không phải là một sự phức tạp mà tôi muốn thêm vào nếu tôi có thể tránh nó và có vẻ như tôi có thể.Kiểm tra ID công nhân rất dễ dàng để đảm bảo chỉ có 1 quy trình đang thực hiện việc này.

Lưu ý tôi đã sử dụng các câu lệnh in thực sự để thực sự đảm bảo thủ thuật arithemic mô -đun hoạt động vì kiểm tra thời gian chính xác rõ ràng là không hoạt động!Nhưng với sự thú vị của tôi làm tôi ngạc nhiên khi sàn nhà đã làm được điều đó.

Hướng dẫn run function every second python - chức năng chạy mỗi giây python

Dharman ♦

28.5K21 Huy hiệu vàng78 Huy hiệu bạc129 Huy hiệu đồng21 gold badges78 silver badges129 bronze badges

Đã trả lời ngày 19 tháng 5 năm 2021 lúc 16:48May 19, 2021 at 16:48

Hướng dẫn run function every second python - chức năng chạy mỗi giây python

Charlie Parkercharlie ParkerCharlie Parker

10K46 Huy hiệu vàng164 Huy hiệu bạc282 Huy hiệu Đồng46 gold badges164 silver badges282 bronze badges