我正在寻找一个Python的库,它将提供at和cron功能相似.
我非常喜欢使用纯Python解决方案,而不是依赖于盒子上安装的工具; 这样我就可以在没有cron的机器上运行.
对于那些不熟悉的人cron:您可以根据以下表达式安排任务:
0 2 * * 7 /usr/bin/run-backup # run the backups at 0200 on Every Sunday
0 9-17/2 * * 1-5 /usr/bin/purge-temps # run the purge temps command, every 2 hours between 9am and 5pm on Mondays to Fridays.
Run Code Online (Sandbox Code Playgroud)
cron时间表达式语法不那么重要,但我希望能有这种灵活性.
如果没有任何东西可以为我开箱即用,那么任何关于构建模块的建议都会感激不尽.
编辑 我对启动进程不感兴趣,只是用Python编写的"作业" - python函数.必要时我认为这将是一个不同的主题,但不是在一个不同的过程中.
为此,我正在寻找cron时间表达式的表现力,但在Python中.
Cron 已经存在多年了,但我试图尽可能地便携.我不能依赖它的存在.
我想永远每60秒在Python中重复执行一个函数(就像目标C中的NSTimer一样).这段代码将作为守护进程运行,实际上就像使用cron每分钟调用python脚本一样,但不需要用户设置.
在这个关于用Python实现的cron的问题中,解决方案似乎实际上只是sleep() x秒.我不需要这样的高级功能,所以也许这样的东西可行
while True:
# Code executed here
time.sleep(60)
Run Code Online (Sandbox Code Playgroud)
这段代码有可预见的问题吗?
我有三个大清单.首先包含bitarrays(模块bitarray 0.8.0),另外两个包含整数数组.
l1=[bitarray 1, bitarray 2, ... ,bitarray n]
l2=[array 1, array 2, ... , array n]
l3=[array 1, array 2, ... , array n]
Run Code Online (Sandbox Code Playgroud)
这些数据结构需要相当多的RAM(总共约16GB).
如果我使用以下方式启动12个子流程:
multiprocessing.Process(target=someFunction, args=(l1,l2,l3))
Run Code Online (Sandbox Code Playgroud)
这是否意味着将为每个子流程复制l1,l2和l3,或者子流程是否会共享这些列表?或者更直接,我会使用16GB或192GB的RAM吗?
someFunction将从这些列表中读取一些值,然后根据读取的值执行一些计算.结果将返回到父进程.someIunction不会修改列表l1,l2和l3.
因此,我认为子流程不需要也不会复制这些巨大的列表,而只是与父级共享它们.这意味着由于linux下的写时复制方法,该程序将占用16GB的RAM(无论我启动多少个子进程)?我是正确的还是我错过了会导致列表被复制的内容?
编辑:在阅读了关于这个主题的更多内容后,我仍然感到困惑.一方面,Linux使用copy-on-write,这意味着不会复制任何数据.另一方面,访问该对象将改变其重新计数(我仍然不确定为什么以及这意味着什么).即便如此,是否会复制整个对象?
例如,如果我定义someFunction如下:
def someFunction(list1, list2, list3):
i=random.randint(0,99999)
print list1[i], list2[i], list3[i]
Run Code Online (Sandbox Code Playgroud)
是否使用此函数意味着将为每个子流程完全复制l1,l2和l3?
有没有办法检查这个?
EDIT2在子流程运行的同时读取更多内容并监视系统的总内存使用情况后,似乎确实为每个子流程复制了整个对象.它似乎是因为引用计数.
在我的程序中实际上不需要l1,l2和l3的引用计数.这是因为l1,l2和l3将保留在内存中(未更改),直到父进程退出.在此之前,不需要释放这些列表使用的内存.事实上,我确信引用计数将保持在0以上(对于这些列表和这些列表中的每个对象),直到程序退出.
所以现在问题变成了,我怎样才能确保不会将对象复制到每个子进程?我可以禁用这些列表和这些列表中的每个对象的引用计数吗?
EDIT3只是一个额外的说明.子进程并不需要修改l1,l2并l3或在这些列表中的任何对象.子进程只需要能够引用其中一些对象,而不会导致为每个子进程复制内存.
我有一个工作单位我希望每N秒发生一次.如果我使用简单化
minute = 60
while True:
doSomeWork()
time.sleep(minute)
Run Code Online (Sandbox Code Playgroud)
取决于doSomeWork()需要多长时间,实际循环周期将是一分钟加上该时间.如果doSomeWork()所花费的时间不是确定性的,则工作周期更加难以预测.
我想做的就是这样
minute = 60
start = time.process_time() #? i can imagine using this, but maybe there's something better?
while True:
doSomeWork()
start += minute
sleep_until(start) #? this is the function I'm in search of
Run Code Online (Sandbox Code Playgroud)
(我正在使用python 3.3)
更新:
在Linux/OSX上,我可以使用itimer from signal来做我正在寻找的东西:
import signal
import datetime
def tick(_, __):
# doSomeWork()
print(datetime.datetime.now())
signal.setitimer(signal.ITIMER_REAL, 60, 60)
signal.signal(signal.SIGALRM, tick)
while True:
signal.pause()
Run Code Online (Sandbox Code Playgroud)
看起来为python3.4开发的郁金香东西也会让这很容易.
是否可以安排一个函数在python中的每个xx毫秒执行,而不阻止其他事件/没有使用延迟/不使用睡眠?
在Python中每x秒重复执行一次函数的最佳方法是什么?解释了如何使用sched模块执行此操作,但解决方案将阻止整个代码执行等待时间(如睡眠).
像下面给出的简单调度是非阻塞的,但是调度只能工作一次 - 重新安排是不可能的.
from threading import Timer
def hello():
print "hello, world"
t = threading.Timer(10.0, hello)
t.start()
Run Code Online (Sandbox Code Playgroud)
我在使用Raspbian安装的Raspberry pi中运行python代码.有没有办法以非阻塞方式安排功能或使用操作系统的"某些功能"触发它?