【发布时间】:2017-04-18 22:34:14
【问题描述】:
我的应用程序由两个通过 TCP 套接字连接的 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()
我的问题归结为:如何通过套接字传递有关第二个进程要访问的内存段的信息?我尝试了以下方法(pickle 和 dill),但均无济于事:
直接在文件上使用
mmap.mmap或存储其内容。结果: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 传递,当然这会(据说)解决所有问题。
【问题讨论】:
标签: python sockets multiprocessing shared-memory