Pylons / waitress

Waitress - A WSGI server for Python 3
https://docs.pylonsproject.org/projects/waitress/en/latest/
Other
1.44k stars 164 forks source link

uwsgi Python module listen_queue #404

Closed arebrik closed 1 year ago

arebrik commented 1 year ago

Hello!

This method not well documented, but it looks like must return same value as we can get from stats server -> "listen_queue" key.

But in my example it always return 0. I write simple client/server to reproduce this behaviour.

server.py:

import uwsgi
import time
from threading import Thread
import socket
import json

monitor = None

def application(env, start_response):
    global monitor
    if monitor is None:
        enable_monitor()

    time.sleep(10)
    start_response('200 OK', [('Content-Type','text/html')])
    return ['resp'.encode()]

def enable_monitor():
    def _monitor():
        while 1:
            api_size = uwsgi.listen_queue()
            stats_size = get_queue_via_stats('127.0.0.1', 1718)
            print(f'queue size: stats-{stats_size}, api-{api_size}')
            time.sleep(2)

    global monitor
    monitor = Thread(target=_monitor)
    monitor.run()

def get_queue_via_stats(hostname, port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((hostname, port))
    s.shutdown(socket.SHUT_WR)
    result = b''
    while 1:
        data = s.recv(1024)
        if len(data) == 0:
            break
        result += data
    s.close()
    return json.loads(result.decode()).get('listen_queue', 0)

client.py:

import aiohttp
import asyncio

HOST = '127.0.0.1'
PORT = 9091

async def worker(session):
    async with session.get(f'http://{HOST}:{PORT}') as resp:
        await resp.text()

async def main():
    async with aiohttp.ClientSession() as session:
        await asyncio.wait(list(
            asyncio.create_task(worker(session)) for _ in range(100)))

asyncio.run(main())

run server: uwsgi --wsgi-file server.py --stats 0.0.0.0:1718 --http :9091 --master --processes 2 in separate terminal run client: python client.py

print from server:

queue size: stats-0, api-0
queue size: stats-0, api-0
queue size: stats-98, api-0
queue size: stats-98, api-0
queue size: stats-98, api-0
queue size: stats-98, api-0

python version: 3.7.4 uwsgi version: 2.0.17.1 os: running in docker under ubuntu 18

mmerickel commented 1 year ago

I don't think your question has anything to do with waitress. Closing as irrelevant to waitress.