我已經實現了一個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