此代码在Linux上正常工作,但在Windows下(预期)失败。我知道多处理模块使用fork()
产生一个新进程,父进程拥有的文件描述符(即打开的套接字)因此被子进程继承。但是,我的理解是,您可以通过多处理发送的唯一类型的数据需要被选中。在Windows和Linux上,套接字对象不可选。Linux为什么可以在多处理器中接受套接字?
from socket import socket, AF_INET, SOCK_STREAM
import multiprocessing as mp
import pickle
sock = socket(AF_INET, SOCK_STREAM)
sock.connect(("www.python.org", 80))
sock.sendall(b"GET/HTTP/1.1\r\nHost: www.python.org\r\n\r\n")
try:
pickle.dumps(sock)
except TypeError:
print("sock is not pickleable")
def foo(obj):
print("Received: {}".format(type(obj)))
data, done = [], False
while not done:
tmp = obj.recv(1024)
done = len(tmp) < 1024
data.append(tmp)
data = b"".join(data)
print(data.decode())
proc = mp.Process(target=foo, args=(sock,))
proc.start()
proc.join()
我的问题是,为什么可以在socket
对象,demonstrably非与pickle对象,具有多重传递吗?它不像Windows那样使用泡菜吗?
文件描述符不是“发送”的,它们就在那里。 –
你是什么意思?我可能(而且必须部分)错误,但我认为“参数”参数中的任何内容都需要可以选择。这不是这种情况吗? – Goodies
参数不被pickle,它们只传递给子进程中的函数。只有*进程之间传输的对象需要进行酸洗。 –