Perforce (P4) Python API жалуется на слишком много блокировок

Я написал приложение, которое открывает несколько подпроцессов, которые инициируют индивидуальные подключения к серверу Perforce. Через некоторое время я получаю это сообщение об ошибке почти во всех дочерних процессах:

Traceback (most recent call last):
File "/Users/peter/Desktop/test_app/main.py", line 76, in p4_execute
    p4.run_login()
File "/usr/local/lib/python3.7/site-packages/P4.py", line 665, in run_login
    return self.run("login", *args, **kargs)
File "/usr/local/lib/python3.7/site-packages/P4.py", line 611, in run
    raise e
File "/usr/local/lib/python3.7/site-packages/P4.py", line 605, in run
    result = P4API.P4Adapter.run(self, *flatArgs)
P4.P4Exception: [P4#run] Errors during command execution( "p4 login" )

    [Error]: "Fatal client error; disconnecting!
            Operation 'client-SetPassword' failed.
            Too many trys to get lock /Users/peter/.p4tickets.lck."

Кто-нибудь знает, что могло вызвать это? Я правильно открываю свои соединения и дважды проверяю все исходные местоположения, которые я должным образом отключаю от сервера через disconnect.

Только удаление .p4tickets.lck вручную работает, пока ошибка не вернется через несколько секунд.

🤔 А знаете ли вы, что...
В Python есть среды разработки, такие как Jupyter Notebook, которые упрощают работу с данными и исследованиями.


2
1 178
1

Ответ:

Решено

Соответствующий код находится здесь:

Я не вижу кодового пути, по которому файл ticket.lck не удалось бы очистить без какой-либо другой ошибки.

Есть ли что-нибудь необычное в домашнем каталоге, в котором находится файл билетов? Например, он находится в сетевом фильтре с некоторой задержкой и каким-то процессом резервного копирования? Или, может быть, тот, который не обеспечивает должным образом блокировку файлов между всеми этими подпроцессами, которые вы создаете?

Как часто ваши скрипты запускают "p4 login" для обновления и перезаписи тикета? Много раз в секунду? Если вы измените их так, чтобы они этого не делали (например, входите только в систему, если еще нет билета), проблема не исчезнет?