(博彩导航网) 关于Python Cookbook中创建线程池代码的一个bug?
在线博彩导航
在线博彩导航
当前位置 : 在线博彩导航 > 博彩导航网

(博彩导航网) 关于Python Cookbook中创建线程池代码的一个bug?

Python Cookbook中对应的章节

问题描述

以下面这段代码为例子,我认为这段代码存在一个缺陷,作者通过下面这段代码限制了最多创建128个线程,但是这样的提前限制会导致一个问题。假设现在有129个客户端对服务器进行逐个分时请求,不是同时请求。作者这样提前限制了线程池中最多只能存在128个线程,但是每个线程处理完客户端连接后就会自动退出。

那么到第129个客户端请求的时候已经没有线程池中已经没有任何线程了,而且客户端都是采用的分时请求,虽然queue中还有任务。采用线程池的目的应该是限制同一时刻最多响应的连接数,这样不是和初衷相违背了吗?


实例代码

服务器等待客户端连接部分的代码

from socket import socket, AF_INET, SOCK_STREAM
from threading import Thread
from queue import Queue

def echo_serveraddr, nworkers:
    # Launch the client workers
    q = Queue
    for n in rangenworkers:
        t = Threadtarget=echo_client, args=q,
        t.daemon = True
        t.start

    # Run the server
    sock = socketAF_INET, SOCK_STREAM
    sock.bindaddr
    sock.listen5
    while True:
        client_sock, client_addr = sock.accept
        q.putclient_sock, client_addr

echo_server,15000, 128

服务器处理客户端连接部分的代码

def echo_clientq:
    
    Handle a client connection
    
    sock, client_addr = q.get
    printGot connection from, client_addr
    while True:
        msg = sock.recv65536
        if not msg:
            break
        sock.sendallmsg
    printClient closed connection

    sock.close

我觉得你的说法是对的。

import time
from Queue import Queue
from threading import Thread, activeCount

G_WORKER_NUM = 1
G_COUNTER = 1

def do_somethingq:
    q.get
    global G_COUNTER
    G_COUNTER += 1
    printG_COUNTER


def main:
    q = Queue
    for n in xrangeG_WORKER_NUM:
        t = Threadtarget=do_something, args=q,
        t.start

    q.putanything,
    q.putanything,
    q.putanything,


if __name__ == __main__:
    main
    time.sleep2
    print activeCount

Output:

说明线程确实是退出了。

或许作者只是想演示创建线程池来限制可以开启的线程数量,并没有做完整的项目考虑。例如线程池里面的线程肯定要能够重用,不能频繁的创建关闭;线程池的大小能够动态适应,当有一定数量的空闲线程就关掉部分,当线程都泡满了还不够用的时候,适当添加一些线程。具体,我觉得可以去查找相关的资料,肯定有解决方案。

他没有在主线程中写q.join

栏目列表

广告位

在线博彩导航