6

मैं एक नया थ्रेड का उपयोग कर रहा हूं जो एक ही समस्या को हल करने का प्रयास करता है। एक सुरक्षित अचार का गठन क्या करता है? this?पायथन वितरित कंप्यूटिंग (काम करता है)

sock.py

from socket import socket 
from socket import AF_INET 
from socket import SOCK_STREAM 
from socket import gethostbyname 
from socket import gethostname 

class SocketServer: 
    def __init__(self, port): 
    self.sock = socket(AF_INET, SOCK_STREAM) 
    self.port = port 
    def listen(self, data): 
    self.sock.bind(("127.0.0.1", self.port)) 
    self.sock.listen(len(data)) 
    while data: 
     s = self.sock.accept()[0] 
     siz, dat = data.pop() 
     s.send(siz) 
     s.send(dat) 
     s.close() 

class Socket: 
    def __init__(self, host, port): 
    self.sock = socket(AF_INET, SOCK_STREAM) 
    self.sock.connect((host, port)) 
    def recv(self, size): 
    return self.sock.recv(size) 

pack.py

#http://stackoverflow.com/questions/6234586/we-need-to-pickle-any-sort-of-callable 
from marshal import dumps as marshal_dumps 
from pickle import dumps as pickle_dumps 
from struct import pack as struct_pack 

class packer: 
    def __init__(self): 
    self.f = [] 
    def pack(self, what): 
    if type(what) is type(lambda:None): 
     self.f = [] 
     self.f.append(marshal_dumps(what.func_code)) 
     self.f.append(pickle_dumps(what.func_name)) 
     self.f.append(pickle_dumps(what.func_defaults)) 
     self.f.append(pickle_dumps(what.func_closure)) 
     self.f = pickle_dumps(self.f) 
     return (struct_pack('Q', len(self.f)), self.f) 

unpack.py

from types import FunctionType 
from pickle import loads as pickle_loads 
from marshal import loads as marshal_loads 
from struct import unpack as struct_unpack 
from struct import calcsize 

#http://stackoverflow.com/questions/6234586/we-need-to-pickle-any-sort-of-callable 

class unpacker: 
    def __init__(self): 
    self.f = [] 
    self.fcompiled = lambda:None 
    self.sizeofsize = calcsize('Q') 
    def unpack(self, sock): 
    size = struct_unpack('Q', sock.recv(self.sizeofsize))[0] 
    self.f = pickle_loads(sock.recv(size)) 
    a = marshal_loads(self.f[0]) 
    b = globals() ## 
    c = pickle_loads(self.f[1]) 
    d = pickle_loads(self.f[2]) 
    e = pickle_loads(self.f[3]) 
    self.fcompiled = FunctionType(a, b, c, d, e) 
    return self.fcompiled 

test.py

from unpack import unpacker 
from pack import packer 
from sock import SocketServer 
from sock import Socket 
from threading import Thread 
from time import sleep 

count = 2 
port = 4446 

def f(): 
    print 42 

def server(): 
    ss = SocketServer(port) 
    pack = packer() 
    functions = [pack.pack(f) for nothing in range(count)] 
    ss.listen(functions) 

if __name__ == "__main__": 
    Thread(target=server).start() 
    sleep(1) 
    unpack = unpacker() 
    for nothing in range(count): 
    print unpack.unpack(Socket("127.0.0.1", port)) 

उत्पादन:

<function f at 0x12917d0> 
<function f at 0x12915f0> 
+0

स्क्रिप्ट का परीक्षण करने के लिए कुछ उदाहरण कोड पोस्ट कर सकता है? धन्यवाद ! –

+0

आपका बहुत स्वागत है! – motoku

+0

त्रुटि किस पंक्ति पर फेंक दी गई है? –

उत्तर

2

ValueError: insecure string pickle उठाया जाता है जब आपका अचार दूषित हो जाता है। क्या आप वाकई पूरे मसालेदार ऑब्जेक्ट को sock.recv() (unpack.py) में प्राप्त कर रहे हैं?

संपादित करें:

import struct 

struct.pack('Q', len(pickled_list)) 
# Send it, and then send the pickled list. 
: किसी भी आकार तुम कर सकते हो के लिए इस से बचने के लिए (अपने Socket वर्ग एक बफर आकार तर्क (यानी

class Socket: 
    def recv(self, bufsize): 
     return self.sock.recv(bufsize) 

) के साथ कहा जा recv का समर्थन करने के लिए होता है)

रिसीवर कार्यक्रम में:

import struct 

length = struct.unpack('Q', sock.recv(struct.calcsize('Q')))[0] 
pickled_list = sock.recv(length) 

'क्यू' एक unsigned long long है। अन्य संरचनाओं के लिए the struct module documentation

+0

धन्यवाद। बफर का आकार बहुत छोटा था। – motoku

+1

@ सेन पेडरसन मेरा संपादन देखें। –

4

मुझे नहीं लगता कि प्रक्रिया वस्तुओं नेटवर्क पर भेजे जाने के लिए तैयार कर रहे हैं है। मल्टीप्रोसेसिंग/process.py में लाइन 256 देखें।

# We subclass bytes to avoid accidental transmission of auth keys over network. 

लगता है जैसे मेरे लिए एक अच्छा कारण है। यदि आप वितरित कंप्यूटिंग करना चाहते हैं, तो आपको library designed for that पर देखना चाहिए।

+0

मैं केवल मूल पुस्तकालयों का उपयोग कर सकता हूं। मेरी पहली पसंद उस सुरक्षा उपाय की सर्कविगेशन होगी, क्योंकि कार्यान्वयन एक निजी नेटवर्क का उपयोग कर रहा है। – motoku

+1

दस्तावेज़ों को देखते हुए, ऐसा लगता है कि 'मल्टीप्रोसेसिंग' ग्लोबल दुभाषिया लॉक से बचने के लिए 'थ्रेडिंग' का एक क्लोन है लेकिन विभिन्न प्रक्रियाओं पर है। मुझे लगता है कि आपके विकल्प आपकी खुद की वितरित कंप्यूटिंग लाइब्रेरी, या ओपन सोर्स के महत्व के विश्वसनीय प्रबंधन को रोल कर रहे हैं। ;) –

संबंधित मुद्दे