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