1

我想知道运行非阻塞 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)然后还调用其他一些函数等。

4

1 回答 1

0

我怎样才能让这个……在后台运行……而不是阻塞主线程,这样我就可以继续……?

这将永远不会在 Python3 中按原样发生(因为 Guido ROSSUM 曾宣称自己,很可能会一直如此,除非 Python 解释器的全面重新设计首先被确定为可行并随后成功进行)

Python 及其所有线程由垄断单例集中控制,这是 Python{2|3} GIL 锁的中央唯一共享资源。

GIL 锁步进主要重新序列化任何[CONCURRENT]基于 py 线程的执行,因此结果是一个纯[SERIAL]交错序列(正确 -主要是完全避免任何并发,任何希望拥有的代码形式越 [PARALLEL]多执行 )。

这就是说,一个人可能会跳出这种 Python-by-design 的限制并产生一个非 Python 框架——比如ZeroMQ,它独立于它工作,有点“除了”python解释器,它会处理所有的信号/messaging 服务独立于智能套接字(由代理的行为原型),完全摆脱了已知的 GIL 锁重新序列化性能瓶颈(并且还允许利用托管和多对多的组合)许多进程的通信架构)

于 2020-01-22T03:08:38.647 回答