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