【发布时间】: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