Этот код отлично работает на 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
объект, очевидно, не pickleable объект передается с использованием многопроцессорной? Разве это не использует рассол, как делает Windows?
Дескрипторы файлов не отправляются, они просто там. –
Что это значит? Я мог быть (и должен быть частично) ошибочным, но я думал, что что-либо в параметре «args» должно быть разборчивым. Разве это не так? – Goodies
Аргументы не маринованные, они просто передаются функции в подпроцессе. Необходимо передавать только объекты, передаваемые * между * процессами. –