Discuss / Python / 廖老师,【OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。】怎么解决?

廖老师,【OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。】怎么解决?

Topic source

久疤_796

#1 Created at ... [Delete] [Delete and Lock User]

我的电脑是win7x64旗舰版。 老师原文中的代码在我的电脑上面运行有问题,@三尺蛮腰的代码是可以的。 不过我也有个问题,就是task_master.py中,如果还没有运行manager.shutdown(),就结束它的话,再次运行(在CMD中)就会出现OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。直接按F5在shell中看不到。 那么这个时候该怎么办? 我更改端口后运行一次就可以,再次改回去运行也是可以的。 难道每次出现这个问题都要这样解决么? 本人新手,求廖老师和其他大神指导

久疤_796

#2 Created at ... [Delete] [Delete and Lock User]

额,之前确实出现该错误后,更改端口,运行task_master.pytask_work.py能正常,改回去再运行也是行的。可是现在竟然改回去不行了。。 这是在CMD下运行的结果:

Process QueueManager-1:
Traceback (most recent call last):
  File "K:\mySetupDir\work\Python3-4\lib\multiprocessing\process.py", line 254,
in _bootstrap
    self.run()
  File "K:\mySetupDir\work\Python3-4\lib\multiprocessing\process.py", line 93, i
n run
    self._target(*self._args, **self._kwargs)
  File "K:\mySetupDir\work\Python3-4\lib\multiprocessing\managers.py", line 517,
 in _run_server
    server = cls._Server(registry, address, authkey, serializer)
  File "K:\mySetupDir\work\Python3-4\lib\multiprocessing\managers.py", line 140,
 in __init__
    self.listener = Listener(address=address, backlog=16)
  File "K:\mySetupDir\work\Python3-4\lib\multiprocessing\connection.py", line 44
7, in __init__
    self._listener = SocketListener(address, family, backlog)
  File "K:\mySetupDir\work\Python3-4\lib\multiprocessing\connection.py", line 58
4, in __init__
    self._socket.bind(address)
OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。

Traceback (most recent call last):
  File "K:\mySetupDir\work\Python3-4\lib\multiprocessing\connection.py", line 31
2, in _recv_bytes
    nread, err = ov.GetOverlappedResult(True)
BrokenPipeError: [WinError 109] 管道已结束。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "K:\mySetupDir\work\Python3-4\workSpace\mycompany2\多进程和多线程\分布式
进程\task_master.py", line 66, in <module>
    test()
  File "K:\mySetupDir\work\Python3-4\workSpace\mycompany2\多进程和多线程\分布式
进程\task_master.py", line 43, in test
    manager.start()
  File "K:\mySetupDir\work\Python3-4\lib\multiprocessing\managers.py", line 495,
 in start
    self._address = reader.recv()
  File "K:\mySetupDir\work\Python3-4\lib\multiprocessing\connection.py", line 25
0, in recv
    buf = self._recv_bytes()
  File "K:\mySetupDir\work\Python3-4\lib\multiprocessing\connection.py", line 32
1, in _recv_bytes
    raise EOFError
EOFError

这是直接按F5后,在shell中看到的结果

Traceback (most recent call last):
  File "K:\mySetupDir\work\Python3-4\lib\multiprocessing\connection.py", line 312, in _recv_bytes
    nread, err = ov.GetOverlappedResult(True)
BrokenPipeError: [WinError 109] 管道已结束。

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "K:\mySetupDir\work\Python3-4\workSpace\mycompany2\多进程和多线程\分布式进程\task_master.py", line 66, in <module>
    test()
  File "K:\mySetupDir\work\Python3-4\workSpace\mycompany2\多进程和多线程\分布式进程\task_master.py", line 43, in test
    manager.start()
  File "K:\mySetupDir\work\Python3-4\lib\multiprocessing\managers.py", line 495, in start
    self._address = reader.recv()
  File "K:\mySetupDir\work\Python3-4\lib\multiprocessing\connection.py", line 250, in recv
    buf = self._recv_bytes()
  File "K:\mySetupDir\work\Python3-4\lib\multiprocessing\connection.py", line 321, in _recv_bytes
    raise EOFError
EOFError

久疤_796

#3 Created at ... [Delete] [Delete and Lock User]

这是task_master.py模块代码

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'task_master.py'

__author__ = 'HZF'

server_ip = '192.168.0.186'
server_port = 5001
server_authkey = b'test'

import random,time,queue
from multiprocessing import freeze_support
from multiprocessing.managers import BaseManager

#发送任务的队列
task_queue = queue.Queue()
#接收结果的队列
result_queue = queue.Queue()
def return_task_queue():
    global task_queue
    return task_queue
def return_result_queue():
    global result_queue
    return result_queue

#从BaseManager继承的QueueManager
class QueueManager(BaseManager):
    pass

def test():
    #把两个Queue都注册到网络上,callable参数关联了Queue对象
    print('注册到网络')
    #QueueManager.register('get_task_queue',callable=lambda:task_queue)
    #QueueManager.register('get_result_queue',callable=lambda:result_queue)
    QueueManager.register('get_task_queue',callable=return_task_queue)
    QueueManager.register('get_result_queue',callable=return_result_queue)

    print('绑定IP、端口、验证码')
    manager = QueueManager(address=(server_ip,server_port)
                           ,authkey=server_authkey)
    print('启动Queue')
    #如果上次没有shutdown(),运行到这里就会报错
    manager.start()

    print('获得通过网络访问的Queue对象')
    task = manager.get_task_queue()
    result = manager.get_result_queue()

    print('放几个任务进去')
    for i in range(10):
        n = random.randint(0,10000)
        print('Put task %d...' % n)
        task.put(n)

    print('从result队列读取结果')
    for i in range(10):
        r = result.get(timeout=10)
        print('Result:%s'%r)

    print('关闭')
    manager.shutdown()
    print('master exit.')

if __name__=='__main__':
    freeze_support()
    test()

久疤_796

#4 Created at ... [Delete] [Delete and Lock User]

这是我最终版本的task_master.py,可能要好点

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'task_master.py'

__author__ = 'HZF'

import random,time,queue,socket
from multiprocessing import freeze_support
from multiprocessing.managers import BaseManager

server_ip = socket.gethostbyname(socket.gethostname())
server_port = 5001
server_authkey = b'test'

#发送任务的队列
task_queue = queue.Queue()
#接收结果的队列
result_queue = queue.Queue()
def return_task_queue():
    global task_queue
    return task_queue
def return_result_queue():
    global result_queue
    return result_queue

#从BaseManager继承的QueueManager
class QueueManager(BaseManager):
    pass

def test():
    try:
        #把两个Queue都注册到网络上,callable参数关联了Queue对象
        print('注册到网络')
        #QueueManager.register('get_task_queue',callable=lambda:task_queue)
        #QueueManager.register('get_result_queue',callable=lambda:result_queue)
        QueueManager.register('get_task_queue',callable=return_task_queue)
        QueueManager.register('get_result_queue',callable=return_result_queue)

        print('绑定IP、端口、验证码')
        manager = QueueManager(address=(server_ip,server_port)
                               ,authkey=server_authkey)
        print('启动Queue')
        manager.start()

        print('获得通过网络访问的Queue对象')
        task = manager.get_task_queue()
        result = manager.get_result_queue()
        #print('dir(task):',dir(task))
        #print('dir(result):',dir(result))
        print('放几个任务进去')
        for i in range(10):
            n = random.randint(0,10000)
            print('Put task %d...' % n)
            task.put(n)

        print('从result队列读取结果')
        for i in range(10):
            r = result.get(timeout=10)
            print('Result:%s'%r)
    except Exception as e:
        print('error:',e)
    finally:
        print('关闭')
        try:
            manager.shutdown()
        except Exception as e:
            print('shutdown error:',e)
        print('master exit.')

if __name__=='__main__':
    freeze_support()
    test()

  • 1

Reply