相关疑难解决方法(0)

如何在Python中获得类似Cron的调度程序?

我正在寻找一个Python的库,它将提供atcron功能相似.

我非常喜欢使用纯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 已经存在多年了,但我试图尽可能地便携.我不能依赖它的存在.

python cron scheduled-tasks

312
推荐指数
12
解决办法
23万
查看次数

在Python中每x秒重复执行一次函数的最佳方法是什么?

我想永远每60秒在Python中重复执行一个函数(就像目标C中的NSTimer一样).这段代码将作为守护进程运行,实际上就像使用cron每分钟调用python脚本一样,但不需要用户设置.

这个关于用Python实现的cron的问题中,解决方案似乎实际上只是sleep() x秒.我不需要这样的高级功能,所以也许这样的东西可行

while True:
    # Code executed here
    time.sleep(60)
Run Code Online (Sandbox Code Playgroud)

这段代码有可预见的问题吗?

python timer

245
推荐指数
12
解决办法
36万
查看次数

多处理中的共享内存

我有三个大清单.首先包含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,l2l3或在这些列表中的任何对象.子进程只需要能够引用其中一些对象,而不会导致为每个子进程复制内存.

python shared-memory multiprocessing large-data

56
推荐指数
4
解决办法
8万
查看次数

python定期循环成语?

我有一个工作单位我希望每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 python-3.x

4
推荐指数
1
解决办法
347
查看次数

python中的非阻塞事件调度

是否可以安排一个函数在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代码.有没有办法以非阻塞方式安排功能或使用操作系统的"某些功能"触发它?

python timer scheduled-tasks nonblocking raspberry-pi

4
推荐指数
1
解决办法
6360
查看次数