mirror of
https://github.com/gsi-upm/senpy
synced 2024-11-22 00:02:28 +00:00
Replace gevent with tornado
Closes #28 Added: * Async test (still missing one that includes the IOLoop) * Async plugin under tests. To manually try async functionalities: ``` senpy -f tests/ ```
This commit is contained in:
parent
1302b0b93c
commit
ef40bdb545
@ -1,6 +1,6 @@
|
|||||||
Flask>=0.10.1
|
Flask>=0.10.1
|
||||||
requests>=2.4.1
|
requests>=2.4.1
|
||||||
gevent>=1.1rc4
|
tornado>=4.4.3
|
||||||
PyLD>=0.6.5
|
PyLD>=0.6.5
|
||||||
six
|
six
|
||||||
future
|
future
|
||||||
|
@ -22,15 +22,16 @@ the server.
|
|||||||
|
|
||||||
from flask import Flask
|
from flask import Flask
|
||||||
from senpy.extensions import Senpy
|
from senpy.extensions import Senpy
|
||||||
from gevent.wsgi import WSGIServer
|
from tornado.wsgi import WSGIContainer
|
||||||
from gevent.monkey import patch_all
|
from tornado.httpserver import HTTPServer
|
||||||
|
from tornado.ioloop import IOLoop
|
||||||
|
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import argparse
|
import argparse
|
||||||
import senpy
|
import senpy
|
||||||
|
|
||||||
patch_all(thread=False)
|
|
||||||
|
|
||||||
SERVER_PORT = os.environ.get("PORT", 5000)
|
SERVER_PORT = os.environ.get("PORT", 5000)
|
||||||
|
|
||||||
|
|
||||||
@ -92,9 +93,10 @@ def main():
|
|||||||
print('Server running on port %s:%d. Ctrl+C to quit' % (args.host,
|
print('Server running on port %s:%d. Ctrl+C to quit' % (args.host,
|
||||||
args.port))
|
args.port))
|
||||||
if not app.debug:
|
if not app.debug:
|
||||||
http_server = WSGIServer((args.host, args.port), app)
|
http_server = HTTPServer(WSGIContainer(app))
|
||||||
|
http_server.listen(args.port, address=args.host)
|
||||||
try:
|
try:
|
||||||
http_server.serve_forever()
|
IOLoop.instance().start()
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
print('Bye!')
|
print('Bye!')
|
||||||
http_server.stop()
|
http_server.stop()
|
||||||
|
@ -303,6 +303,7 @@ class Senpy(object):
|
|||||||
else:
|
else:
|
||||||
th = Thread(target=act)
|
th = Thread(target=act)
|
||||||
th.start()
|
th.start()
|
||||||
|
return th
|
||||||
|
|
||||||
def deactivate_plugin(self, plugin_name, sync=False):
|
def deactivate_plugin(self, plugin_name, sync=False):
|
||||||
try:
|
try:
|
||||||
@ -327,6 +328,7 @@ class Senpy(object):
|
|||||||
else:
|
else:
|
||||||
th = Thread(target=deact)
|
th = Thread(target=deact)
|
||||||
th.start()
|
th.start()
|
||||||
|
return th
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def validate_info(cls, info):
|
def validate_info(cls, info):
|
||||||
|
21
tests/plugins/async_plugin/asyncplugin.py
Normal file
21
tests/plugins/async_plugin/asyncplugin.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
from senpy.plugins import AnalysisPlugin
|
||||||
|
|
||||||
|
import multiprocessing
|
||||||
|
|
||||||
|
|
||||||
|
class AsyncPlugin(AnalysisPlugin):
|
||||||
|
def _train(self, process_number):
|
||||||
|
return process_number
|
||||||
|
|
||||||
|
def _do_async(self, num_processes):
|
||||||
|
with multiprocessing.Pool(processes=num_processes) as pool:
|
||||||
|
values = pool.map(self._train, range(num_processes))
|
||||||
|
return values
|
||||||
|
|
||||||
|
def activate(self):
|
||||||
|
self.value = self._do_async(4)
|
||||||
|
|
||||||
|
def analyse_entry(self, entry, params):
|
||||||
|
values = self._do_async(2)
|
||||||
|
entry.async_values = values
|
||||||
|
yield entry
|
8
tests/plugins/async_plugin/asyncplugin.senpy
Normal file
8
tests/plugins/async_plugin/asyncplugin.senpy
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
---
|
||||||
|
name: Async
|
||||||
|
module: asyncplugin
|
||||||
|
description: I am async
|
||||||
|
author: "@balkian"
|
||||||
|
version: '0.1'
|
||||||
|
async: true
|
||||||
|
extra_params: {}
|
@ -167,7 +167,7 @@ class ExtensionsTest(TestCase):
|
|||||||
assert len(senpy.plugins) > 1
|
assert len(senpy.plugins) > 1
|
||||||
|
|
||||||
def test_convert_emotions(self):
|
def test_convert_emotions(self):
|
||||||
self.senpy.activate_all()
|
self.senpy.activate_all(sync=True)
|
||||||
plugin = Plugin({
|
plugin = Plugin({
|
||||||
'id': 'imaginary',
|
'id': 'imaginary',
|
||||||
'onyx:usesEmotionModel': 'emoml:fsre-dimensions'
|
'onyx:usesEmotionModel': 'emoml:fsre-dimensions'
|
||||||
@ -205,3 +205,14 @@ class ExtensionsTest(TestCase):
|
|||||||
[plugin, ],
|
[plugin, ],
|
||||||
params)
|
params)
|
||||||
assert len(r3.entries[0].emotions) == 1
|
assert len(r3.entries[0].emotions) == 1
|
||||||
|
|
||||||
|
# def test_async_plugin(self):
|
||||||
|
# """ We should accept multiprocessing plugins with async=False"""
|
||||||
|
# thread1 = self.senpy.activate_plugin("Async", sync=False)
|
||||||
|
# thread1.join(timeout=1)
|
||||||
|
# assert len(self.senpy.plugins['Async'].value) == 4
|
||||||
|
|
||||||
|
# resp = self.senpy.analyse(input='nothing', algorithm='Async')
|
||||||
|
|
||||||
|
# assert len(resp.entries[0].async_values) == 2
|
||||||
|
# self.senpy.activate_plugin("Async", sync=True)
|
||||||
|
Loading…
Reference in New Issue
Block a user