Как я могу записать одновременные данные в CSV-файл из нескольких потоков в Python - PullRequest
1 голос
/ 07 октября 2019

Я получаю координаты мыши (mouse_x, mouse_y) из thread_1, который работает с tkinter. У меня есть другой поток (thread_2), работающий одновременно, чтобы получить оценку направления взгляда с opencv одновременно как (gaze_x, gaze_y)

, теперь я хочу записать их оба одновременно в один и тот же csvfile, не записывая, если какие-либо данные отсутствуют.

Я могу получить файл tmp для записи в файл csv из каждого потока, но не могу сделать это одновременно

with open(csv_filename, 'w', newline='') as csvfile:
    writer = csv.writer(csvfile, dialect=csv.excel, delimiter=',',
                        quotechar='|', quoting=csv.QUOTE_MINIMAL)
    writer.writerow(["mouse_x","mouse_y","gaze_x","gaze_y"])

def get_mouse_coordinates():
        def motion(event):
                  x, y = event.x, event.y
                  tmp = [x, y]
                  with open(csv_filename, 'a+', newline='') as csvfile:
                          writer = csv.writer(csvfile, delimiter=',',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL) 
                           writer.writerow(list(tmp))
t1 = Thread(target=get_mouse_coordinates)
t1.start()


def get_gaze_coordinates
   .....
    gaze_x,gaze_y = ....

t2 = Thread(target=get_gaze_coordinates)
t2.start()

Я пытался писать в отдельные двоеточия, но файл csv не может быть заполненОдновременно .... Я был бы признателен за любую помощь ... С уважением

Редактировать: Мне нужно записать две данные одновременно. Здесь мне нужно записать очень точное положение цели (указатель мыши здесь), на которую смотрит субъект, и направление взгляда этого субъекта. Мне нужно, чтобы они оба были записаны в одну строку в определенный момент времени, чтобыЯ могу сопоставить. Разве нет одного образца для одновременного сопоставления двух столбцов данных?

1 Ответ

0 голосов
/ 09 октября 2019

Для одновременной записи данных из нескольких потоков в один файл должен быть создан механизм синхронизации. Например - другой поток:

queuForSync1 = queue.Queue(1)
queuForSync2 = queue.Queue(1)
t1 = Thread(target=get_mouse_coordinates, args=(queuForSync1,))
# in get_mouse_coordinates you have to: queuForSync1.put(dataFromThread1)
t1.start()
...
t2 = Thread(target=get_gaze_coordinates, args=(queuForSync2,))
# in get_gaze_coordinates you have to: queuForSync2.put(dataFromThread2)
t2.start()
...
tSync = Thread(target=syncThread, args=(queuForSync1, queuForSync2, fileName))
tSync.start()
...
def syncThread(q1, q2, fileName):
    dataFromThread1 = None 
    dataFromThread2 = None 
    with open(fileName, 'a+', newline='') as csvfile:
        writer = csv.writer(csvfile, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL) 
        while True:  # Here - a sync Event May be used to get out of the Loop and Join Thread Nicely
            try:
                dataFromThread1 = q1.get(block=False)
            except Exception as ex:
                pass
            # ... same for dataFromThread2
            if dataFromThread1 is not None and dataFromThread2 is not None :
                writer.writerow(list(dataFromThread1, dataFromThread2))  # Here data will be written Into File.
                csvfile.flush()  # Important

Дополнительно - если данные из 1 потока не изменяются, а из потока 2 постоянно изменяются - может быть создан буфер для хранения последних данных, полученных из потока.

...