【问题标题】:Python socket with worker threads带有工作线程的 Python 套接字
【发布时间】:2014-04-09 07:32:24
【问题描述】:

我正在使用 Python 来了解客户端-服务器和线程编程的基础知识。

这是我的 main.py 应用程序:

from threading import Thread 
from Server import Server


    class Worker(object):

        def __init__(self, clients):
            #constructor
            self.clients = clients

        def start(self):
            while True:
                print("it work as expected!")
                conn, addr = self.clients.get()
                print( conn.recv(1024) )

    #create a instance of the server
    server = Server()

    #put on a new thread 
    def serverThreadCallback(server):
        server.start()

    def createWorkerCallback():
        worker = Worker(server.getClients())
        worker.start()


    #put the server on a new thread
    serverThread = Thread( target=serverThreadCallback, args=(server, )  )
    serverThread.daemon = True
    serverThread.start()

    '''
    workerThread = Thread(target=createWorkerCallback) 
    workerThread.daemon = True
    workerThread.start()
    '''

这是我的 server.py

import socket
import queue


class Server(object):
    '''
    classdocs
    '''
    def __init__(self):
        '''
        Constructor
        '''
        self.clients = queue.Queue() 

    def create(self):
        print("Creating server...")
        server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR , 1)
        self.socket = server

    def listen(self):
        print("Starting server...")
        self.socket.bind( ("0.0.0.0", 9002) )
        self.socket.listen(10)
        print("Server started. Listening on localhost port 9002")
        while(True): 
            #conn, addr = self.server.accept()
            self.clients.put(self.socket.accept())

    def start(self):
        self.create()
        self.listen()

    def getClients(self):
        return self.clients

当我尝试在该线程中启动服务器时,监听方法 不打电话。服务器的 create() 方法中出现了问题。

我做错了什么?

【问题讨论】:

  • def start(self): 是线程特定的名称,不应替换它。
  • 我已经用 def startServer(self): 替换了 def start(self): 并且仍然存在同样的问题。来自listen方法的代码没有被执行。
  • startServer 中的每一行添加一个print(),看看为我们缩小范围有多大。

标签: python multithreading sockets


【解决方案1】:

首先,您发布的代码有几个语法错误:

ma​​in.py:

1)从你的class声明开始的缩进是错误的

2)你应该调用from server import Server(注意模块名称是server - 小写)

server.py

3)你应该打电话给import Queue(而不是import queue

4)因此对self.clients = queue.Queue()的调用应该变成self.clients = Queue.Queue()(模块名称是Queue,大写Q

除此之外,您必须在serverThread.start() 之后添加serverThread.join(),否则主线程完成并且程序在您的服务器线程有机会启动之前终止。

最后,您可能希望更改线程内对 accept() 的调用,以便它不时超时以正确处理 Ctrl+C 中断(否则您只能通过杀死它来完成您的程序)

【讨论】:

  • 感谢您的回答。如果我想等待套接字消息(使用recv),我需要为每个客户端创建一个新线程并将socket.recv()放在一个while循环中?
【解决方案2】:
serverThread.daemon = True

当 Python 程序退出时,守护线程突然停止。
可能listen() 方法还没有被调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2013-05-03
    相关资源
    最近更新 更多