【问题标题】:Multithreaded webserver in PythonPython中的多线程网络服务器
【发布时间】:2016-09-01 08:52:32
【问题描述】:

视频讲座中的一个例子。背景:讲师给出了一个最简单的python web server。他创建了一个套接字,绑定它,进行监听,接受连接,接收数据,并以大写形式将其发送回客户端。然后他说有个缺点:这个web server是单线程的。那我们分叉吧。

我不能很好地理解这个例子。但首先,程序退出 (sys.exit())。但我无法再次运行它:

socket.error: [Errno 98] 地址已在使用中。

我试图找出哪个进程正在侦听端口 8080:netstat --listen | grep 8080。什么都没有。

那么,8080 上的监听是什么?以及如何杀死它?

稍后添加: 有一种感觉,如果我等待一段时间(比如 5-10 分钟),我可以再次运行程序。

import os
import socket
import sys


server_socket = socket.socket()
server_socket.bind(('', 8080))
server_socket.listen(10)
print "Listening"


while True:
    client_socket, remote_address = server_socket.accept()
    print "PID: {}".format(os.getpid())
    child_pid = os.fork()
    print "child_pid {}".format(child_pid)

    if child_pid == 0:    
        request = client_socket.recv(1024)
        client_socket.send(request.upper())
        print '(child {}): {}'.format(client_socket.getpeername(), request)
        client_socket.close()
        sys.exit()
    else:
        client_socket.close()

server_socket.close()

【问题讨论】:

  • 试试netstat -tulnp | grep 8080
  • 没用。通过 sudo 尝试过。顺便说一句,我在问题中添加了一点(请看一下“稍后添加”)。
  • 也许在绑定到套接字之前尝试 server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)。
  • 不会发生在我身上:当我在 OSX 上运行您的代码时,我得到了一个监听服务器,我可以使用 Ctrl-C 退出并重新启动,而不会出现您提到的错误消息。 - 你在什么平台上运行代码?

标签: python multithreading webserver


【解决方案1】:

正确的netstat用法是:

netstat -tanp

因为您需要-a 选项来显示侦听套接字。添加 grep 以快速定位您的程序:

netstat -tanp| grep 8080

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 2011-01-15
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    相关资源
    最近更新 更多