Этот код отлично работает на Linux, но не работает под Windows (что ожидается). Я знаю, что многопроцессорный модуль использует fork()
для создания нового процесса, и поэтому файловые дескрипторы, принадлежащие родительскому элементу (т.е. Открытый сокет), наследуются дочерним элементом. Тем не менее, я понимаю, что единственный тип данных, которые вы можете отправлять посредством многопроцессорной обработки, должен быть разборчивым. В Windows и 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
, явно непродуманный объект, с многопроцессорной обработкой? Не использует ли марихуанец как Windows?