python实现计时器_用Python实现计时器

让我们从对现有实现的一些评论开始:Went with a wrapper around Bisect for the sorted delta list: http://code.activestate.com/recipes/577197-sortedcollection/

虽然这给了你O(1)个pops(只要你保持列表的时间顺序相反),它使每次插入O(N)(同样,对于不太常见的操作,如删除任意作业,如果你有一个“cancel”API)。因为你所做的插入和pops一样多,这意味着整个过程在算法上并不比未排序的列表好。在

将其替换为^{}(这正是它们的用途)将得到O(logn)插入。(请注意,Python的heapq没有peek,但这是因为heap[0]相当于heap.peek(0),所以您不需要它。)

如果您还需要执行其他操作(取消、非破坏性迭代等)O(logn),那么您需要一个搜索树;请查看PyPI上的blist和{}中的一些好的操作。在Went with celery to provide the tick - A granularity of 1 minute, where the worker would trigger the timer_tick function provided by my Timer class. The timer_tick essentially should go through the sorted list, decrementing the head node every tick. Then if any nodes have ticked down to 0, kick off the callback and remove those nodes from the sorted timer list.

保持目标时间而不是三角洲会更好。对于目标时间,您只需执行以下操作:while q.peek().timestamp <= now():

process(q.pop())

同样,这是O(1)而不是O(N),它简单得多,它将队列中的元素视为不可变的,并且避免了迭代花费的时间比计时长的任何可能的问题(对于1分钟的滴答声可能不是问题…)。在

现在,请回答你的主要问题:Is there a way I can share my SortedCollection

是的。如果您只需要一个(timestamp, id)对的优先级堆,那么您可以像multiprocessing.Array一样轻松地将其放入multiprocessing.Array,只不过需要显式地跟踪长度。然后你只需要同步每个操作,就这样。在

如果您每分钟只打一次勾,而且您预计会更忙,那么您可以使用Lock来同步,并让调度工作进程自己打勾。在

但老实说,我会完全放弃勾号,只使用一个Condition-它更灵活,概念上更简单(即使它是一个多一点的代码),这意味着你在没有工作要做时使用0%的CPU,在负载下快速、平稳地响应。例如:

^{pr2}$

不管怎么说,这就把我们带到了充满就业机会的世界。在

由于weakdict显式地存储对进程内对象的引用,因此跨进程共享它没有任何意义。您要存储的是不可变的对象,它们定义了实际的作业,而不是可变作业本身。那就只不过是一句老生常谈

但是,一个简单的旧的dict并不是一件容易跨进程共享的事情。在

实现这一点的简单方法是使用dbm数据库(或shelve包装器),而不是内存中的dict,与Lock同步。但这意味着每次有人想更改数据库时都要重新刷新和打开数据库,这可能是不可接受的。在

比如说,切换到sqlite3数据库似乎有点过头了,但可能要简单得多。在

另一方面,您在这里实际拥有的操作只有“映射下一个id到这个作业并返回id”和“弹出并返回这个id指定的作业”。那真的需要口述吗?键是整数,你可以控制它们。一个Array,加上一个Value作为下一个键,再加上一个Lock,你就快完成了。问题是您需要某种密钥溢出方案。而不是仅仅next_id += 1,您必须翻身检查已经使用的插槽:with lock:

next_id += 1

if next_id == size: next_id = 0

if arr[next_id] is None:

arr[next_id] = job

return next_id

另一个选择是只将dict存储在主进程中,并使用Queue使其他进程查询它。在

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值