It’s using waitress under the hood, it’s not single threaded.

> On Jan 24, 2022, at 09:51, Mikko Ohtamaa <mi...@redinnovation.com> wrote:
> 
> Hi Michael,
> 
> 
> Have you looked at the StopableWSGIServer in webtest? I wonder if it can help 
> debug what you've been seeing.
> 
> https://docs.pylonsproject.org/projects/webtest/en/latest/api.html#webtest.http.StopableWSGIServer
>  
> <https://docs.pylonsproject.org/projects/webtest/en/latest/api.html#webtest.http.StopableWSGIServer>
> 
> Thanks for the heads up. In this case, I hope to have a proper process and 
> threading support for the server. FAIK StopableWSGIServer is single-threaded, 
> but I could be wrong.
> 
> -Mikko
> 
> 
> - Michael
> 
>> On Jan 22, 2022, at 05:11, Mikko Ohtamaa <mi...@redinnovation.com 
>> <mailto:mi...@redinnovation.com>> wrote:
>> 
>> Hi,
>> 
>> I am trying to add webhook support to the otherwise command-line application 
>> using Waitress web server. Webhook endpoints are defined as Pyramid routes. 
>> I also wish to test this functionality using pytest.
>> 
>> The server gets created fine, but on pytest shutdown, I am getting an error: 
>> OSError: [Errno 9] Bad file descriptor. What would be the nice way to spin 
>> Waitress up and down on demand?
>> 
>> How do I create the server instance:
>> 
>> def create_webhook_server(host: str, port: int, username: str, password: 
>> str, queue: Queue) -> MultiSocketServer:
>>     app = create_pyramid_app(username, password, queue, production=False)
>>     server = create_server(app, host=host, port=port)
>>     logger.info <http://logger.info/>("Webhook server will spawn at %s:%d", 
>> host, port)
>>     return server
>> 
>> How do I start and test the server in the unit test:
>> 
>> def test_auth_ok():
>>     """Username and password allow to access the webhook"""
>>     queue = Queue()
>>     server = create_webhook_server("127.0.0.1", 5000, "test", "test", queue)
>>     server_url = "http://test:test@127.0.0.1:5000 
>> <http://test:test@127.0.0.1:5000/>"
>>     webhook_thread = Thread(target=server.run)
>>     webhook_thread.start()
>>     # Test home view
>>     resp = requests.get(server_url)
>>     assert resp.status_code == 200
>>     server.close()
>> 
>> The exception I am getting:
>> 
>> tests/test_webhook_auth.py::test_auth_ok
>>   
>> /Users/moo/Library/Caches/pypoetry/virtualenvs/tradeexecutor-13XfP0tc-py3.9/lib/python3.9/site-packages/_pytest/threadexception.py:75:
>>  PytestUnhandledThreadExceptionWarning: Exception in thread Thread-1
>> 
>>   Traceback (most recent call last):
>>     File 
>> "/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py",
>>  line 973, in _bootstrap_inner
>>       self.run()
>>     File 
>> "/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py",
>>  line 910, in run
>>       self._target(*self._args, **self._kwargs)
>>     File 
>> "/Users/moo/Library/Caches/pypoetry/virtualenvs/tradeexecutor-13XfP0tc-py3.9/lib/python3.9/site-packages/waitress/server.py",
>>  line 322, in run
>>       self.asyncore.loop(
>>     File 
>> "/Users/moo/Library/Caches/pypoetry/virtualenvs/tradeexecutor-13XfP0tc-py3.9/lib/python3.9/site-packages/waitress/wasyncore.py",
>>  line 245, in loop
>>       poll_fun(timeout, map)
>>     File 
>> "/Users/moo/Library/Caches/pypoetry/virtualenvs/tradeexecutor-13XfP0tc-py3.9/lib/python3.9/site-packages/waitress/wasyncore.py",
>>  line 172, in poll
>>       r, w, e = select.select(r, w, e, timeout)
>>   OSError: [Errno 9] Bad file descriptor
>> 
>>     warnings.warn(pytest.PytestUnhandledThreadExceptionWarning(msg))
>> 
>> tests/test_webhook_auth.py::test_auth_failed
>>   
>> /Users/moo/Library/Caches/pypoetry/virtualenvs/tradeexecutor-13XfP0tc-py3.9/lib/python3.9/site-packages/_pytest/threadexception.py:75:
>>  PytestUnhandledThreadExceptionWarning: Exception in thread Thread-2
>> 
>>   Traceback (most recent call last):
>>     File 
>> "/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py",
>>  line 973, in _bootstrap_inner
>>       self.run()
>>     File 
>> "/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py",
>>  line 910, in run
>>       self._target(*self._args, **self._kwargs)
>>     File 
>> "/Users/moo/Library/Caches/pypoetry/virtualenvs/tradeexecutor-13XfP0tc-py3.9/lib/python3.9/site-packages/waitress/server.py",
>>  line 322, in run
>>       self.asyncore.loop(
>>     File 
>> "/Users/moo/Library/Caches/pypoetry/virtualenvs/tradeexecutor-13XfP0tc-py3.9/lib/python3.9/site-packages/waitress/wasyncore.py",
>>  line 245, in loop
>>       poll_fun(timeout, map)
>>     File 
>> "/Users/moo/Library/Caches/pypoetry/virtualenvs/tradeexecutor-13XfP0tc-py3.9/lib/python3.9/site-packages/waitress/wasyncore.py",
>>  line 172, in poll
>>       r, w, e = select.select(r, w, e, timeout)
>>   OSError: [Errno 9] Bad file descriptor
>> 
>>     warnings.warn(pytest.PytestUnhandledThreadExceptionWarning(msg))
>> 
>> 
>> 
>> 
>> 
>> 
>> --
>> You received this message because you are subscribed to the Google Groups 
>> "pylons-discuss" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to pylons-discuss+unsubscr...@googlegroups.com 
>> <mailto:pylons-discuss+unsubscr...@googlegroups.com>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/pylons-discuss/CAK8RCUtiHH3N00sUthcUKj6Ur-ZjNsAGkXByo5FEPvuKZY%3DgNg%40mail.gmail.com
>>  
>> <https://groups.google.com/d/msgid/pylons-discuss/CAK8RCUtiHH3N00sUthcUKj6Ur-ZjNsAGkXByo5FEPvuKZY%3DgNg%40mail.gmail.com?utm_medium=email&utm_source=footer>.
> 
> 
> --
> You received this message because you are subscribed to the Google Groups 
> "pylons-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to pylons-discuss+unsubscr...@googlegroups.com 
> <mailto:pylons-discuss+unsubscr...@googlegroups.com>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/pylons-discuss/033C221D-0022-460C-8AC8-9FA05A784273%40gmail.com
>  
> <https://groups.google.com/d/msgid/pylons-discuss/033C221D-0022-460C-8AC8-9FA05A784273%40gmail.com?utm_medium=email&utm_source=footer>.
> 
> --
> You received this message because you are subscribed to the Google Groups 
> "pylons-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to pylons-discuss+unsubscr...@googlegroups.com 
> <mailto:pylons-discuss+unsubscr...@googlegroups.com>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/pylons-discuss/CAK8RCUtU_e6unFeZMHxbBGRTQSOtj4a_kjMXyGhoXLYx9w_MJQ%40mail.gmail.com
>  
> <https://groups.google.com/d/msgid/pylons-discuss/CAK8RCUtU_e6unFeZMHxbBGRTQSOtj4a_kjMXyGhoXLYx9w_MJQ%40mail.gmail.com?utm_medium=email&utm_source=footer>.

-- 
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to pylons-discuss+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pylons-discuss/7589611F-9FE5-4E13-9429-175D902A637B%400x58.com.

Attachment: signature.asc
Description: Message signed with OpenPGP

Reply via email to