python - 在另一个线程中在 python3 中运行的非阻塞套接字服务器

标签 python multithreading sockets asynchronous concurrent-processing

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

最佳答案

Q : how would I make this … run in the background … and not block the main thread so I can continue…?

这在 Python3 中永远不会发生 (从那时起,正如 Guido ROSSUM 自己所宣称的那样,很可能会一直如此,除非 Python 解释器的彻底重新设计首先被认为可行,然后成功进行)

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

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

这就是说,人们可能会跳出这种Python设计的限制并产生一个非Pythonic框架 - 例如 ZeroMQ ,它独立于Python解释器“之外”工作,并且可以通过智能套接字(由代理的行为原型(prototype))独立处理所有信令/消息服务,完全摆脱了已知的GIL锁重新性能的序列化瓶颈(并且还允许利用共置和 多对多进程的通信架构的组合)

关于python - 在另一个线程中在 python3 中运行的非阻塞套接字服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59849569/

相关文章:

python - 如果存在子字符串,则从元组中删除项目

c - 多线程输出困惑

c++ - C++ 编译器做了什么来确保不同但相邻的内存位置可以安全地用于不同的线程?

c++ - 使用 select 的 tcp 和 udp echoclient 服务器

java - 数据报接收方法因超时而被阻止

python - 选择具有非零值且在 pandas 中共享索引且无循环的列

python - 如何将 QScintilla 语法突出显示应用于 PyQt4 中的 QTextEdit?

python - 如何在 pandas 的 fillna 中使用 math.sin()

java - 在Java中确认来自不同线程的rabbitMq消息

node.js - NodeJS : TCP socket server only returns data the first time