Есть много способов получить желаемый эффект, но для начала нам нужна функция, которую мы можем вызвать.
def save_datetime(file='date.txt', user=getpass.getuser()):
with open(file, 'a+') as f:
f.write('register: ' + user + '\t' + str(datetime.datetime.now().time()) + '\n')
Теперь нам нужна функция для цикла.
def threadingtime_every_sec(sec=60):
import threading, time
def loop():
while True:
save_datetime()
time.sleep(sec)
threading.Thread(target=loop).start()
Я понимаю, что вы не хотите использовать time.sleep (), но поскольку он запускает поток, он не заметен и поэтому запускается отдельно.Полный сценарий будет выглядеть так:
import datetime
import getpass
import threading
import time
def save_datetime(file='date.txt', user=getpass.getuser()):
with open(file, 'a+') as f:
f.write('register: ' + user + '\t' + str(datetime.datetime.now().time()) + '\n')
def threadingtime_every_sec(sec=60):
def loop():
while True:
save_datetime()
time.sleep(sec)
threading.Thread(target=loop).start()
if __name__ == '__main__':
threadingtime_every_sec(1)
Я бы настоятельно рекомендовал этот ответ и этот вопрос , поскольку он дает вам несколько способов - и гораздо лучшую систему потоков, использующуюTimer
функция и класс.Полный сценарий в вашем случае будет:
import threading
import time
import getpass
import datetime
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
def save_datetime(file='date.txt', user=getpass.getuser()):
with open(file, 'a+') as f:
f.write('register: ' + user + '\t' + str(datetime.datetime.now().time()) + '\n')
if __name__ == '__main__':
RepeatedTimer(1, save_datetime)
Это создаст пример текстового файла, подобного этому:
register: james 11:51:54.988595
register: james 11:51:55.988939
register: james 11:51:56.988767
Если вы не хотите, чтобы миллисекунды заменили str(datetime.datetime.now().time())
на datetime.datetime.now().strftime('%H:%M:%S')
.