我的應用程序由兩個通過TCP套接字連接的Python進程組成。第一個過程用於讀取文件並將它們放在共享內存中,而不是按下套接字,以便其他進程可以讀取它們。通過Python中的套接字在兩個進程之間傳遞共享內存對象
import os
import zmq
import mmap
import time
import ctypes
import pickle
import dill
import tempfile
import multiprocessing as mp
MEETING_POINT = 'tcp://127.0.0.1:12345'
FILEFD, FILEPATH = tempfile.mkstemp()
def run_server():
Server().run()
def read_file():
return open(FILEPATH, 'r').read()
class Client(object):
def __init__(self):
self.ctx = zmq.Context()
self.socket = self.ctx.socket(zmq.DEALER)
self.socket.connect(MEETING_POINT)
def cleanup(self):
self.socket.close()
self.ctx.term()
def run(self):
self.socket.send(dill.dumps(read_file()))
class Server(object):
def __init__(self):
self.ctx = zmq.Context()
self.socket = self.ctx.socket(zmq.DEALER)
self.socket.bind(MEETING_POINT)
def cleanup(self):
self.socket.close()
self.ctx.term()
def run(self):
f = dill.loads(self.socket.recv())
print(f)
def main():
with open(FILEPATH, 'w') as fd:
fd.write('blah')
mp.Process(target=run_server).start()
time.sleep(.5) # a (poor, but tolerable) alternative to handshaking
Client().run()
if __name__ == '__main__':
main()
我的問題歸結爲:我怎麼通過左右的內存段的信息,第二過程是接入,通過插座?直接
使用
mmap.mmap
上的文件或存儲它的內容:我已經試過以下(既pickle
和dill
),都無濟於事。結果:TypeError: Required argument 'fileno' (pos 1) not found
當在服務器端取消時。使用multiprocessing.Array:
with open(FILEPATH, 'r') as fd: contents = bytearray(fd.read()) arr = mp.Array(ctypes.c_byte, contents, lock=False)
結果:pickle.PicklingError: Can't pickle <class 'multiprocessing.sharedctypes.c_byte_Array_4'>: it's not found as multiprocessing.sharedctypes.c_byte_Array_4
在客戶端酸洗時。
我相信有一個更簡單的(和工作)的方式來做到這一點,是嗎?我無法預先讀取所有必需的文件,並將它們打包到multiprocessing.Array
中,以在創建服務器進程時作爲args
傳遞,當然這將會(據推測)解決所有問題。