2011-06-04 19 views
7

Son zamanlarda, turşu işlemlerinin kullanımı yoluyla dağıtılmış hesaplama işlemlerini kolaylaştırmaya çalışan bazı Python kodlarıyla ilgili bir soru sorulmuştur. Görünüşe göre, bu işlevsellik tarihsel olarak mümkün, ancak güvenlik nedeniyle aynı işlevsellik devre dışı bırakıldı. Bir işlev nesnesini bir soket üzerinden iletmeye çalışan ikincide, sadece referans iletildi. Eğer yanılıyorsam düzeltin ama bu sorunun Python'un geç bağlanmasına bağlı olduğuna inanmıyorum. Süreç ve iş parçacığı nesnelerinin elde edilemediği varsayımı göz önüne alındığında, kalınabilir bir nesneyi iletmenin herhangi bir yolu var mıdır? Her iş için sıkıştırılmış kaynak kodu iletmekten kaçınmak isteriz, çünkü bu muhtemelen tüm girişimi anlamsız hale getirecektir. Taşınabilirlik nedeniyle sadece Python çekirdek kütüphanesi kullanılabilir.Herhangi bir tür kalibrelenebilir uçbirimi seçmemiz gerekiyor.

+2

"Güvenlik nedenlerinden dolayı * X'e izin verilmez *; bu konuda nasıl çalışabilirim?" Sorusunu sorduğunuzda, kendinize neden ihtiyaç duyduğunuzu açıklayan ** detaylı bir açıklama ile hazırlanmalısınız * * etrafında çalışmak için. Güvenlik ciddi bir iştir. –

+0

@Karl, Bu mükemmel bir nokta. Bir geçici çözümün bir ihtiyaç olduğunun belirtilmesi bir abartı olacaktır. Kolay çıkış yolunu önerme hatasını bile yaptım. Artur'un önerisiyle başlıyorum. – motoku

+1

Bir kod python ise, python çekirdek kitaplığı kadar taşınabilir. Kalibre edilebilen herhangi bir python serileştiricisine sahibim… ve saf python paralel ve dağıtılmış bilgi işlem kütüphanesi için omurga olarak kullanılır. Taşınabilir ... ve hiyerarşik paralel ve dağıtılmış paralel harita ve boru ağları oluşturabilir. Bir paket saf python ise, bunu hariç tutmamalısınız - zaten yüklü değilse dağıtılmış kümedeki kullanıcı alanınıza yükleyin. Temel olarak 'copy_reg' çağrılarının bir koleksiyonu olan 'dill 'paketine bakın. –

cevap

6

Sen bayt kodu sıralamakta ve diğer fonksiyon şeyler turşu olabilir:

import marshal 
import pickle 

marshaled_bytecode = marshal.dumps(your_function.func_code) 
# In this process, other function things are lost, so they have to be sent separated. 
pickled_name = pickle.dumps(your_function.func_name) 
pickled_arguments = pickle.dumps(your_function.func_defaults) 
pickled_closure = pickle.dumps(your_function.func_closure) 
# Send the marshaled bytecode and the other function things through a socket (they are byte strings). 
send_through_a_socket((marshaled_bytecode, pickled_name, pickled_arguments, pickled_closure)) 

başka piton programında yer: yeniden oluşturulması

import marshal 
import pickle 
import types 

# Receive the marshaled bytecode and the other function things. 
marshaled_bytecode, pickled_name, pickled_arguments, pickled_closure = receive_from_a_socket() 
your_function = types.FunctionType(marshal.loads(marshaled_bytecode), globals(), pickle.loads(pickled_name), pickle.loads(pickled_arguments), pickle.loads(pickled_closure)) 

Ve işlevi içinde globaller ilişkin referansları olurdu işlevi alan komut dosyası. Python 3

, kullanılan fonksiyon nitelikleri __code__, __name__, __defaults__ ve __closure__ bulunmaktadır.

Lütfen unutmayın, send_through_a_socket ve receive_from_a_socket gerçekte mevcut değildir ve bunları, veriyi soketler üzerinden aktaran gerçek kodla değiştirmelisiniz.

+0

[That] (http://stackoverflow.com/questions/6212326/python-distributed-computing-with-error-edited) _seems_ kısmen işleyecektir. – motoku

+0

Teşekkürler. Diğer iş parçacığına bakın. – motoku

İlgili konular