Fire and forget with Schedule
Fire and forget with Schedule
我正在尝试安排执行我不关心它们何时以及如何完成的任务。它是 Python3.5 并且没有安装或想要安装其他异步包,只有 "asyncio"。
有一个很好的包 "schedule" 可以很好地安排时间:
import schedule
schedule.every(5).seconds.do(call_my_remote_url)
while 1:
schedule.run_pending()
time.sleep(1)
有一个可以完成工作的代码:
def fire_and_forget(task, *args, **kwargs):
loop = asyncio.get_event_loop()
if callable(task):
return loop.run_in_executor(None, task, *args, **kwargs)
else:
raise TypeError('Task must be a callable')
然而,当我把它放在一起时:
import schedule
import time
import datetime
import asyncio
def call_my_remote_url():
# Do stuff, completion of which I don't care. For example
print("started @ "+str(datetime.datetime.now().time()))
time.sleep(5)
print("completed @ " + str(datetime.datetime.now().time()))
def fire_and_forget(task, *args, **kwargs):
loop = asyncio.get_event_loop()
if callable(task):
return loop.run_in_executor(None, task, *args, **kwargs)
else:
raise TypeError('Task must be a callable')
schedule.every(5).seconds.do(fire_and_forget(call_my_remote_url))
while 1:
schedule.run_pending()
time.sleep(1)
惨败:
(env) $ python3 example_fire_and_forget_with_scheduler.py
started @ 12:19:04.901547
Traceback (most recent call last):
File "example_fire_and_forget_with_scheduler.py", line 21, in <module>
schedule.every(5).seconds.do(fire_and_forget(call_my_remote_url))
File "/Users/user/Projects/env/lib/python3.5/site-packages/schedule/__init__.py", line 352, in do
self.job_func = functools.partial(job_func, *args, **kwargs)
TypeError: the first argument must be callable
completed @ 12:19:09.906020
(env)$
似乎 "shedule" 模块不满意,但是我不明白为什么以及如何修复它。有什么想法或 简单 替代方案吗?
(请注意,它不仅是异步的,而且必须按时完成并忘记)
您正在以一种它不喜欢的方式将参数传递给 do
。稍微简化问题,以下似乎有效:
import schedule
import time
import datetime
def call_my_remote_url():
# Do stuff, completion of which I don't care. For example
print("started @ "+str(datetime.datetime.now().time()))
time.sleep(5)
print("completed @ " + str(datetime.datetime.now().time()))
def fire_and_forget(task, *args, **kwargs):
if callable(task):
return task()
else:
raise TypeError('Task must be a callable')
schedule.every(5).seconds.do(fire_and_forget, call_my_remote_url)
while 1:
schedule.run_pending()
time.sleep(1)
所以fire_and_forget
的参数传给了do
。我似乎无法在文档中找到详细说明,但 this example.
暗示了这一点
我正在尝试安排执行我不关心它们何时以及如何完成的任务。它是 Python3.5 并且没有安装或想要安装其他异步包,只有 "asyncio"。
有一个很好的包 "schedule" 可以很好地安排时间:
import schedule
schedule.every(5).seconds.do(call_my_remote_url)
while 1:
schedule.run_pending()
time.sleep(1)
有一个可以完成工作的代码:
def fire_and_forget(task, *args, **kwargs):
loop = asyncio.get_event_loop()
if callable(task):
return loop.run_in_executor(None, task, *args, **kwargs)
else:
raise TypeError('Task must be a callable')
然而,当我把它放在一起时:
import schedule
import time
import datetime
import asyncio
def call_my_remote_url():
# Do stuff, completion of which I don't care. For example
print("started @ "+str(datetime.datetime.now().time()))
time.sleep(5)
print("completed @ " + str(datetime.datetime.now().time()))
def fire_and_forget(task, *args, **kwargs):
loop = asyncio.get_event_loop()
if callable(task):
return loop.run_in_executor(None, task, *args, **kwargs)
else:
raise TypeError('Task must be a callable')
schedule.every(5).seconds.do(fire_and_forget(call_my_remote_url))
while 1:
schedule.run_pending()
time.sleep(1)
惨败:
(env) $ python3 example_fire_and_forget_with_scheduler.py
started @ 12:19:04.901547
Traceback (most recent call last):
File "example_fire_and_forget_with_scheduler.py", line 21, in <module>
schedule.every(5).seconds.do(fire_and_forget(call_my_remote_url))
File "/Users/user/Projects/env/lib/python3.5/site-packages/schedule/__init__.py", line 352, in do
self.job_func = functools.partial(job_func, *args, **kwargs)
TypeError: the first argument must be callable
completed @ 12:19:09.906020
(env)$
似乎 "shedule" 模块不满意,但是我不明白为什么以及如何修复它。有什么想法或 简单 替代方案吗? (请注意,它不仅是异步的,而且必须按时完成并忘记)
您正在以一种它不喜欢的方式将参数传递给 do
。稍微简化问题,以下似乎有效:
import schedule
import time
import datetime
def call_my_remote_url():
# Do stuff, completion of which I don't care. For example
print("started @ "+str(datetime.datetime.now().time()))
time.sleep(5)
print("completed @ " + str(datetime.datetime.now().time()))
def fire_and_forget(task, *args, **kwargs):
if callable(task):
return task()
else:
raise TypeError('Task must be a callable')
schedule.every(5).seconds.do(fire_and_forget, call_my_remote_url)
while 1:
schedule.run_pending()
time.sleep(1)
所以fire_and_forget
的参数传给了do
。我似乎无法在文档中找到详细说明,但 this example.