Jad*_*d S 4 python concurrency asynchronous tornado python-3.x
我正在编写一个进程(称为请求进程),它将定期发送 HTTP 请求,但可以随时被另一个线程/进程(称为主进程)中断。最初我使用线程池来处理请求multiprocessing.Event
对象在发送下一个请求之前等待适当的延迟:
# in the main process
poison_pill_event= multiprocessing.Event()
# pass "poison_pill_event" to the requesting process
# in the requesting process which sends requests every wait_interval seconds
poison_pill_event.wait(timeout=time_interval)
Run Code Online (Sandbox Code Playgroud)
这将允许我拥有 time.sleep() 的可中断版本,以防我需要终止进程。否则,它将允许代码在超时后继续运行。
最近,我发现考虑到我所需的吞吐量和资源,异步设计是更合适的替代方案,我尝试使用 Tornado。开始时gen.sleep
用作非阻塞等待,但不能被中断。然后切换到使用Toro.Event 的等待功能以允许中断。但是,Toro.Eventdelay
与 multiprocessing.Event 不同timeout
处在于它引发 Timeout 异常并因此中断执行。另外,我不相信我可以在进程之间共享它,所以我现在试图将我的主进程与请求进程合并,但这应该不会太难。
所以我的问题是如何重新模拟我multiprocessing.Event.wait
在 Tornado 中的行为?
您不再需要 Toro。Tornado 4.2 及更高版本包含 Toro 的所有功能。
尝试这样的事情,使用条件而不是事件:
import datetime
import logging
from tornado import gen, options
from tornado.ioloop import IOLoop
from tornado.locks import Condition
condition = Condition()
@gen.coroutine
def waiter():
for _ in range(10):
yield condition.wait(timeout=datetime.timedelta(seconds=1))
logging.info("Tick")
@gen.coroutine
def notifier():
yield gen.sleep(4.5)
logging.info("Notify")
condition.notify()
@gen.coroutine
def runner():
# Yield two Futures; wait for waiter() and notifier() to finish.
yield [waiter(), notifier()]
options.parse_command_line() # Configures logging.
IOLoop.current().run_sync(runner)
Run Code Online (Sandbox Code Playgroud)
你会看到像这样的日志输出:
[I 160712 12:00:28 foo:15] Tick
[I 160712 12:00:29 foo:15] Tick
[I 160712 12:00:30 foo:15] Tick
[I 160712 12:00:31 foo:15] Tick
[I 160712 12:00:31 foo:21] Notify
[I 160712 12:00:31 foo:15] Tick
[I 160712 12:00:32 foo:15] Tick
[I 160712 12:00:33 foo:15] Tick
[I 160712 12:00:34 foo:15] Tick
[I 160712 12:00:35 foo:15] Tick
[I 160712 12:00:36 foo:15] Tick
Run Code Online (Sandbox Code Playgroud)
请注意,在记录“Notify”的那一刻,有两个“Ticks”,但除此之外,Ticks 每秒只发生一次。
归档时间: |
|
查看次数: |
525 次 |
最近记录: |