我有一个简单的程序,可以在本地网络中搜索打开的端口,并将连接的套接字与本地地址一起存储在字典中。现在,我使用Manager共享字典来存储这些条目,但是它只接受简单的对象,而不接受套接字实例。以下是代码:
from multiprocessing import Process, Manager
import socket
manager = Manager()
# Store connected sockets
sockets = manager.dict()
def ping_addr(addr=None, port=None, timeout=None):
"""
Create a socket and try to establish a connection to a specific address. If a connection is established, append
the socket to the sockets dictionary.
:param addr: The address.
:param port: The port number.
:param timeout: How many seconds to wait until its decided that the connection has been refused.
:return: None
"""
global sockets
# Setup the client socket
csocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
csocket.settimeout(timeout)
# Try to connect
try:
csocket.connect((addr, port))
print 'connected to {}:{}'.format(addr, port)
# This works
sockets.update({addr: 0})
# This doesnt work
sockets.update({addr: csocket})
except socket.error:
pass
for i in range(256):
proc = Process(target=ping_addr, kwargs={'addr': '192.168.1.{}'.format(i), 'port': 14540, 'timeout': 0.5})
proc.start()我得到的错误是:
Process Process-4:
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "/home/alex/PycharmProjects/proj/test.py", line 29, in ping_addr
sockets.update({addr: csocket})
File "<string>", line 2, in update
File "/usr/lib/python2.7/multiprocessing/managers.py", line 758, in _callmethod
conn.send((self._id, methodname, args, kwds))
TypeError: expected string or Unicode object, NoneType found我对代理做了一个简短的研究,但没有找到将它们实现到我的代码中的方法,所以我请求帮助。如何使套接字实例与Manager字典兼容?
发布于 2017-10-30 07:24:37
将套接字从父进程传递到子进程是非常常见的做法。从python3.4开始,您可以通过multiprocessing.Manager直接共享一个套接字对象,但是在python2.7中,您必须自己连接它(请看这里的全部要点):
import socket
import copy_reg
from multiprocessing.reduction import rebuild_socket, reduce_socket
copy_reg.pickle(socket.socket, reduce_socket, rebuild_socket)发布于 2017-10-29 18:21:31
套接字不能通过Manager.dict传递到另一个进程。每个python套接字都有一个OS级别的套接字。操作系统知道套接字和进程之间的绑定,并维护套接字所有权。只能在创建套接字的过程中使用套接字。也可以在unix类系统的子进程中使用。
https://stackoverflow.com/questions/47000859
复制相似问题