为啥我的工作线程没有使用 python 多线程产生

Posted

技术标签:

【中文标题】为啥我的工作线程没有使用 python 多线程产生【英文标题】:Why my worker thread is not spawning using python multithreading为什么我的工作线程没有使用 python 多线程产生 【发布时间】:2019-04-08 17:37:35 【问题描述】:

我正在尝试侦听端口的基本服务器程序,并且对于每个传入请求,它都会生成新的守护线程并继续执行。以前类似的代码曾经可以工作,现在这个东西不工作了。

server.py

import multiprocessing as mu
from time import sleep
from random import random
import socket

def worker():
    while(True):
        print("Inside worker....")
        sleep(2)

socketObj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ("127.0.0.1", 8080)
socketObj.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
socketObj.bind(server_address)
socketObj.listen(10)

while(True):
    print("Listening...")
    data_socket, client_address = socketObj.accept()
    a = data_socket.recv(9000)
    p = mu.Process(target=worker, args=())
    p.daemon = True
    p.start()

client.py

import socket

s = "dummydata"

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect(('127.0.0.1', 8080))
socket.send(str.encode(s)) 

我先运行服务器,然后运行客户端。不知何故,它不断为每个请求打印Listening...(实际上它有时会打印两次)并且从未打印过Inside worker...。为什么守护线程永远不会产生?它在您的机器上的行为是否相同?如果是,为什么?

【问题讨论】:

无法复制,在我的电脑上运行良好。 它是否在您的机器上打印Inside worker... 是的,内部工人 【参考方案1】:

我在我的机器上以完全相同的顺序测试了与您完全相同的代码,这对我来说看起来不错。我先运行server.py,然后运行client.py,得到了预期的答案。

请确保您从不同的终端运行这两个脚本,并且您使用的端口在使用后被释放,因为如果您没有正确结束/终止进程,端口可能会保持忙碌(fuser 命令在Linux,看this answer)。因此,尝试使用另一个端口号应该可以。

在下面的链接中,您可以看到我第一次启动客户端脚本之前和之后的服务器终端图片。

【讨论】:

哦,不知道我的 Windows 机器出了什么问题。刚刚将其移至 Ubuntu 并开始工作:\

以上是关于为啥我的工作线程没有使用 python 多线程产生的主要内容,如果未能解决你的问题,请参考以下文章

python 多线程与GIL

为啥使用了线程池速度没有变化呢python

多核CPU上python多线程并行的一个假象

python中的多线程为啥会报错?

为啥有人说Python的多线程是鸡肋?

为啥有人说 Python 的多线程是鸡肋