-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Move serve_multiple, fix tests (#357)
* Move serve_multiple, remove stop_events, fix tests Moves serve_multiple out of the app, removes stop_event (adds a deprecation warning, but it also wasn't doing anything) fixes multiprocessing tests so that they don't freeze pytest's runner. Other notes: Also moves around some imports so that they are better optimized as well. * Re-add in stop_event, maybe it wasn't so bad! * Get rid of unused warnings import
- Loading branch information
1 parent
fad9fbc
commit 59242df
Showing
4 changed files
with
94 additions
and
144 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,81 +1,26 @@ | ||
from multiprocessing import Array, Event, Process | ||
from time import sleep, time | ||
from ujson import loads as json_loads | ||
|
||
import pytest | ||
import multiprocessing | ||
import random | ||
import signal | ||
|
||
from sanic import Sanic | ||
from sanic.response import json | ||
from sanic.utils import local_request, HOST, PORT | ||
|
||
from sanic.utils import HOST, PORT | ||
|
||
# ------------------------------------------------------------ # | ||
# GET | ||
# ------------------------------------------------------------ # | ||
|
||
# TODO: Figure out why this freezes on pytest but not when | ||
# executed via interpreter | ||
@pytest.mark.skip( | ||
reason="Freezes with pytest not on interpreter") | ||
def test_multiprocessing(): | ||
app = Sanic('test_json') | ||
|
||
response = Array('c', 50) | ||
@app.route('/') | ||
async def handler(request): | ||
return json({"test": True}) | ||
|
||
stop_event = Event() | ||
async def after_start(*args, **kwargs): | ||
http_response = await local_request('get', '/') | ||
response.value = http_response.text.encode() | ||
stop_event.set() | ||
|
||
def rescue_crew(): | ||
sleep(5) | ||
stop_event.set() | ||
|
||
rescue_process = Process(target=rescue_crew) | ||
rescue_process.start() | ||
|
||
app.serve_multiple({ | ||
'host': HOST, | ||
'port': PORT, | ||
'after_start': after_start, | ||
'request_handler': app.handle_request, | ||
'request_max_size': 100000, | ||
}, workers=2, stop_event=stop_event) | ||
|
||
rescue_process.terminate() | ||
|
||
try: | ||
results = json_loads(response.value) | ||
except: | ||
raise ValueError("Expected JSON response but got '{}'".format(response)) | ||
|
||
assert results.get('test') == True | ||
|
||
@pytest.mark.skip( | ||
reason="Freezes with pytest not on interpreter") | ||
def test_drain_connections(): | ||
app = Sanic('test_json') | ||
"""Tests that the number of children we produce is correct""" | ||
# Selects a number at random so we can spot check | ||
num_workers = random.choice(range(2, multiprocessing.cpu_count() * 2 + 1)) | ||
app = Sanic('test_multiprocessing') | ||
process_list = set() | ||
|
||
@app.route('/') | ||
async def handler(request): | ||
return json({"test": True}) | ||
def stop_on_alarm(*args): | ||
for process in multiprocessing.active_children(): | ||
process_list.add(process.pid) | ||
process.terminate() | ||
|
||
stop_event = Event() | ||
async def after_start(*args, **kwargs): | ||
http_response = await local_request('get', '/') | ||
stop_event.set() | ||
signal.signal(signal.SIGALRM, stop_on_alarm) | ||
signal.alarm(1) | ||
app.run(HOST, PORT, workers=num_workers) | ||
|
||
start = time() | ||
app.serve_multiple({ | ||
'host': HOST, | ||
'port': PORT, | ||
'after_start': after_start, | ||
'request_handler': app.handle_request, | ||
}, workers=2, stop_event=stop_event) | ||
end = time() | ||
assert len(process_list) == num_workers | ||
|
||
assert end - start < 0.05 |