python os fork 监听socket问题

很水的长毛怪兽 2017-03-07 09:45:06
main.py

import os, socket, sys
from worker import Worker

print os.getpid(), 'process start'

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setblocking(0)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(("127.0.0.1", 5000))
sock.listen(10)

for i in range(3):

w = Worker(i, os.getpid(), sock)
pid = os.fork()
if pid != 0:
continue

try:
w.run()
except SystemExit:
raise
except:
sys.exit(-1)

import time

time.sleep(20)
print 'end!'


woker.py

import errno
import os
import select
import socket


class Worker(object):
def __init__(self, workerid, ppid, socket):
self.id = workerid
self.ppid = ppid
self.socket = socket
self.socket.setblocking(0)
self.address = self.socket.getsockname()
self.timeout = 10
self.alive = True

def run(self):
while self.alive:
nr = 0
while self.alive:
try:
client, addr = self.socket.accept()
msg = client.recv(1024)
print msg.decode(), os.getpid()
print '--------------'
nr += 1
except socket.error, e:
if e[0] in (errno.EAGAIN, errno.ECONNABORTED):
print 'socket.error', os.getpid()
break # Uh oh!

raise
if nr == 0: break

while self.alive:
try:
ret = select.select([self.socket], [], [],
self.timeout)
if ret[0]:
break
except select.error, e:
if e[0] == errno.EINTR:
print 'select error', os.getpid()
break
raise


这样子,所有进程都不能accpet到client端的连接。
都会进入 ‘socket.error’ 那个exception里面

求解。。
...全文
94 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 1 楼 uiuiy1 的回复:
因为你设置了非阻塞sock.setblocking(0)
为什么设置了阻塞就会那样呢?
屎克螂 2017-03-08
  • 打赏
  • 举报
回复
因为你设置了非阻塞sock.setblocking(0)

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧