Неблокирующий сокет-сервер, работающий в python3 в другом потоке - PullRequest
1 голос
/ 22 января 2020

Я хотел бы знать, как лучше всего запустить неблокирующий сервер сокетов python3.

В настоящее время у меня есть код:

def start(data):
    global sock
    try:

        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        sock.bind(("0.0.0.0", 8080))

        sock.listen(2)

        while True:
            #Does something
            client.close()

    except KeyboardInterrupt:
        kill()

def kill():
    sock.close()

В моей основной программе: Как сделать так, чтобы этот сервер сокетов работал в фоновом режиме (например, в другом потоке), а не блокировал основной поток, чтобы я мог продолжать выполнять другие действия в основном потоке после создания конечной точки? Например, в моем основном потоке я хотел бы иметь возможность вызывать createEndpoint(data), а затем также вызывать некоторые другие функции и т. Д. c.

1 Ответ

0 голосов
/ 22 января 2020

Q : как бы я сделал это ... работать в фоновом режиме ... и не блокировать основной поток, чтобы я мог продолжить ...?

Этого никогда не произойдет в Python3 как есть (поскольку, как заявил сам Гвидо Россум, скорее всего, так и останется, если только полная реинжиниризация Python -интерпретатора не будет впервые решена осуществимой и затем успешно выполнено)

Python и все его потоки централизованно контролируются монополистом c singleton, центральным уникальным общим ресурсом GIL-блокировки Python {2 | 3}.

Степпинг GIL-блокировки принципиально повторно сериализует любое просто - [CONCURRENT] выполнение на основе py-thread, так что в результате получается последовательность с чисто чередованием [SERIAL] (справа - Принципиально избегая любого параллелизма, тем более любая желаемая форма выполнения [PARALLEL] -кода).

При этом можно прыгнуть из этого Python -при проектировании сохранил ограничение и породил не-pythoni c framework - li ke ZeroMQ , который работает независимо от этого, своего рода «помимо» python -интерпретатора, и который будет обрабатывать все службы сигнализации / обмена сообщениями независимо через интеллектуальные сокеты (архетипированные поведением агентов), имея полностью исключен из известного узкого места повторной сериализации GIL-блокировки для производительности (и также позволил бы использовать сочетание колокейшн и обмен данными между многими процессами архитектуры)

...