我已经实现了一个Python套接字服务器。它将来自多台摄像机的图像数据发送到客户端。我请求处理程序类的样子:在Python中多次并行运行类方法
class RequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
while True:
data = self.request.recv(1024)
if data.endswith('0000000050'): # client requests data
for camera_id, camera_path in _video_devices.iteritems():
message = self.create_image_transfer_message(camera_id, camera_path)
self.request.sendto(message, self.client_address)
def create_image_transfer_message(self, camera_id, camera_path):
# somecode ...
我不得不坚持,因为客户端的服务器socket。它可以工作,但问题在于它可以顺序工作,所以上传的照相机图像之间存在很大的延迟。我想创建传输消息并行通话之间的一个小的延迟。
我试图用pool class从multiprocessing:
import multiprocessing
class RequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
...
pool = multiprocessing.Pool(processes=4)
messages = [pool.apply(self.create_image_transfer_message, args=(camera_id, camera_path)) for camId, camPath in _video_devices.iteritems()]
但这抛出:
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
我想知道如果有另一种方式来创建一个并行的传输消息定义的通话间延迟?
编辑:
我使用来自多个相机的数据创建响应消息。问题是,如果我运行图像抓取程序太靠近彼此,我会得到图像伪像,因为USB总线过载。我发现,以0.2秒的时间顺序调用图像抓取将解决问题。摄像头在图像抓取功能运行的整个过程中都不会发送数据,因此延迟的并行校准会生成良好的图像,并且两者之间只有很小的延迟。
你已经遇到了Python的multiproces唱衰弱。 Python进程通过酸洗对象并通过管道来回发送(幕后)。 'pickle'对它可以处理的内容有限制(https://docs.python.org/2/library/pickle.html#what-can-be-pickled-and-unpickled)。在你的情况下,你有一个函数或类在模块级别没有定义的地方,它正在扼杀pickler。 – 2014-10-17 13:52:09