Python 如何实施';SomeAsyncWorker()';从瓶子里?

Python 如何实施';SomeAsyncWorker()';从瓶子里?,python,asynchronous,bottle,gevent,Python,Asynchronous,Bottle,Gevent,我有一堆长时间运行的脚本,它们执行一些数字运算,当它们运行时,通过打印将输出写入控制台,我想从浏览器中调用这些脚本,并在运行时在浏览器中显示进度。我目前正在玩瓶子,正在研究这本相当整洁的入门书 我想尝试事件回调,因为这似乎完全符合我的问题,脚本将作为AsyncWorker运行(理想情况下由一些消息队列管理,以限制在任何一个实例上运行的数量),并定期写回它的状态。但我无法理解SomeAsyncWorker()是什么-它是tornado类还是我必须实现的gevent类,还是其他什么 @route('

我有一堆长时间运行的脚本,它们执行一些数字运算,当它们运行时,通过打印将输出写入控制台,我想从浏览器中调用这些脚本,并在运行时在浏览器中显示进度。我目前正在玩瓶子,正在研究这本相当整洁的入门书

我想尝试事件回调,因为这似乎完全符合我的问题,脚本将作为AsyncWorker运行(理想情况下由一些消息队列管理,以限制在任何一个实例上运行的数量),并定期写回它的状态。但我无法理解SomeAsyncWorker()是什么-它是tornado类还是我必须实现的gevent类,还是其他什么

@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,所以我甚至不确定我到底做了什么),为什么我在这个问题上一直得不到支持?这似乎是一个合理的问题,没有具体的答案,只有其他选择?