Многопроцессорная блокировка не работает должным образом - PullRequest
0 голосов
/ 13 марта 2020

Здесь я читаю файл пакета и создаю итератор этого объекта. Когда я перебираю этот объект в разных процессах с блокировкой, он выдает ошибку. Я сомневаюсь, что Лок не работает, как я ожидаю. Где я делаю не так?

import rosbag
from multiprocessing import Lock,Process

bag = rosbag.Bag('/home/vaasu/Downloads/rosdata.bag')
bagIter = bag.__iter__()

def target(l):
        for x in range(2000):
            l.acquire()
            topic,msg,time = bagIter.__next__()
            l.release()
            print(x)

l = Lock()
p1 = Process(target=target,args=(l,))
p2 = Process(target=target,args=(l,))
p1.start()
p2.start()

Но когда я реализую аналогичные логи c, используя потоки и блокировку потоков, это работает безупречно! Заранее спасибо.

Ошибка:

Process Process-1:
Traceback (most recent call last):
  File "/tmp/genpy_eqjdd7qv/tmp8rqh1aak.py", line 65, in deserialize
    (self.data,) = _get_struct_f().unpack(str[start:end])
struct.error: unpack requires a buffer of 4 bytes

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "testBag.py", line 11, in target
    topic,msg,time = bagIter.__next__()
  File "/opt/ros/melodic/lib/python2.7/dist-packages/rosbag/bag.py", line 2679, in read_messages
    yield self.seek_and_read_message_data_record((entry.chunk_pos, entry.offset), raw, return_connection_header)
  File "/opt/ros/melodic/lib/python2.7/dist-packages/rosbag/bag.py", line 2854, in seek_and_read_message_data_record
    msg.deserialize(data)
  File "/tmp/genpy_eqjdd7qv/tmp8rqh1aak.py", line 68, in deserialize
    raise genpy.DeserializationError(e) #most likely buffer underfill
genpy.message.DeserializationError: unpack requires a buffer of 4 bytes
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...