Python 如何实施';SomeAsyncWorker()';从瓶子里?
我有一堆长时间运行的脚本,它们执行一些数字运算,当它们运行时,通过打印将输出写入控制台,我想从浏览器中调用这些脚本,并在运行时在浏览器中显示进度。我目前正在玩瓶子,正在研究这本相当整洁的入门书 我想尝试事件回调,因为这似乎完全符合我的问题,脚本将作为AsyncWorker运行(理想情况下由一些消息队列管理,以限制在任何一个实例上运行的数量),并定期写回它的状态。但我无法理解SomeAsyncWorker()是什么-它是tornado类还是我必须实现的gevent类,还是其他什么Python 如何实施';SomeAsyncWorker()';从瓶子里?,python,asynchronous,bottle,gevent,Python,Asynchronous,Bottle,Gevent,我有一堆长时间运行的脚本,它们执行一些数字运算,当它们运行时,通过打印将输出写入控制台,我想从浏览器中调用这些脚本,并在运行时在浏览器中显示进度。我目前正在玩瓶子,正在研究这本相当整洁的入门书 我想尝试事件回调,因为这似乎完全符合我的问题,脚本将作为AsyncWorker运行(理想情况下由一些消息队列管理,以限制在任何一个实例上运行的数量),并定期写回它的状态。但我无法理解SomeAsyncWorker()是什么-它是tornado类还是我必须实现的gevent类,还是其他什么 @route('
@route('/fetch')
def fetch():
body = gevent.queue.Queue()
worker = SomeAsyncWorker()
worker.on_data(body.put)
worker.on_finish(lambda: body.put(StopIteration))
worker.start()
return body
(这不完全是对你问题的回答,但你可以采取另一种策略。)
我已经拼凑了一个非常简单的瓶子,它很适合放在瓶子下面。下面是一个例子:
import bottle
import time
from mtbottle import MTServer
app = bottle.Bottle()
@app.route('/')
def foo():
time.sleep(2)
return 'hello, world!\n'
app.run(server=MTServer, host='0.0.0.0', port=8080, thread_count=3)
# app is nonblocking; it will handle up to 3 requests concurrently.
# A 4th concurrent request will block until one of the first 3 completed.
一个缺点是该端口上的所有端点都是异步的;相比之下,gevent方法(我认为)可以让您更好地控制哪些方法是异步的,哪些是同步的
希望这有帮助 我在这里找到了一种使用gevent.queue的方法,它应该不难适应瓶子的工作
# wsgi_longpolling/better_responses.py
from gevent import monkey
monkey.patch_all()
import datetime
import time
from gevent import Greenlet
from gevent import pywsgi
from gevent import queue
def current_time(body):
current = start = datetime.datetime.now()
end = start + datetime.timedelta(seconds=60)
while current < end:
current = datetime.datetime.now()
body.put('<div>%s</div>' % current.strftime("%Y-%m-%d %I:%M:%S"))
time.sleep(1)
body.put('</body></html>')
body.put(StopIteration)
def handle(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/html')])
body = queue.Queue()
body.put(' ' * 1000)
body.put("<html><body><h1>Current Time:</h1>")
g = Greenlet.spawn(current_time, body)
return body
server = pywsgi.WSGIServer(('127.0.0.1', 1234), handle)
print "Serving on http://127.0.0.1:1234..."
server.serve_forever()
#wsgi_longpolling/better_responses.py
从gevent导入猴子
猴子
导入日期时间
导入时间
从gevent进口Greenlet
从gevent导入pywsgi
从gevent导入队列
def当前_时间(正文):
current=start=datetime.datetime.now()
end=start+datetime.timedelta(秒=60)
当前<结束时:
current=datetime.datetime.now()
body.put(“%s”%current.strftime(“%Y-%m-%d%I:%m:%s”))
时间。睡眠(1)
主体。放置(“”)
body.put(停止迭代)
def句柄(环境、启动和响应):
开始响应('200OK',[('Content-Type','text/html'))
body=queue.queue()
主体。放置(''*1000)
body.put(“当前时间:”)
g=绿色小体。繁殖(当前_时间,体)
返回体
server=pywsgi.WSGIServer(('127.0.0.1',1234),句柄)
打印“送达”http://127.0.0.1:1234..."
服务器。永远为您服务()
谢谢,我来看看。我很乐意看到任何选项,到目前为止,我已经尝试过socket.io等,但对于我试图实现的目标来说,它们似乎都过于复杂。虽然这不是一个真正的异步解决方案,但它让我继续前进。@Lars:我不同意;在任何情况下,在某种程度上,这不是确切的答案,我已经添加了一个确认。仅仅说“不是答案”对任何人都没有帮助;我欢迎你的建设性编辑。谢谢。我也在找,但是找不到。你成功完成了吗?不,对不起,我一直没有弄明白,然后转向其他替代方案(我目前没有使用Python,所以我甚至不确定我到底做了什么),为什么我在这个问题上一直得不到支持?这似乎是一个合理的问题,没有具体的答案,只有其他选择?