Правильный способ разархивировать проиндексированный файл в UDF Python Snowflake.Python

Программы на Python
Ответить
Anonymous
 Правильный способ разархивировать проиндексированный файл в UDF Python Snowflake.

Сообщение Anonymous »

Я работаю над реализацией вывода модели PyTorch в UDF/UDTF Snowflake. Я следую официальному примеру https://docs.snowflake.com/en/developer ... taged-file
Это наиболее подходящий фрагмент кода из примера:

Код: Выделить всё

 # File lock class for synchronizing write access to /tmp.
class FileLock:
def __enter__(self):
self._lock = threading.Lock()
self._lock.acquire()
self._fd = open('/tmp/lockfile.LOCK', 'w+')
fcntl.lockf(self._fd, fcntl.LOCK_EX)

def __exit__(self, type, value, traceback):
self._fd.close()
self._lock.release()

# Get the location of the import directory. Snowflake sets the import
# directory location so code can retrieve the location via sys._xoptions.
IMPORT_DIRECTORY_NAME = "snowflake_import_directory"
import_dir = sys._xoptions[IMPORT_DIRECTORY_NAME]

# Get the path to the ZIP file and set the location to extract to.
zip_file_path = import_dir + "spacy_en_core_web_sm.zip"
extracted = '/tmp/en_core_web_sm'

# Extract the contents of the ZIP. This is done under the file lock
# to ensure that only one worker process unzips the contents.
with FileLock():
if not os.path.isdir(extracted + '/en_core_web_sm/en_core_web_sm-2.3.1'):
with zipfile.ZipFile(zip_file_path, 'r') as myzip:
myzip.extractall(extracted)
Архив модели доставляется в рабочую область пользовательской функции и помещается в каталог, полученный из файла sys._xoptions. В примере кода рассматривается проблема, заключающаяся в том, что вычисления распределяются между несколькими рабочими потоками, работающими на одной машине, и разархивирование должно выполняться один раз одним из них, а остальные должны ждать.
В основном код имеет смысл, за исключением одного бита. Какой смысл создавать экземпляр threading.Lock в методе __enter__ класса FileLock и получать его? Если это предназначено для синхронизации потоков, не имеет ли смысла каким-то образом разделить объект блокировки между потоками? В противном случае каждый поток создает свой собственный экземпляр блокировки и получает его, как это чего-нибудь достигнет?
Я считаю, что код фактически достигает своей цели, используя блокировку файла, которая фактически является общей для всех потоков/процессов, выполняющих этот код, потому что это эксклюзивная блокировка файла для одного и того же файла для всех из них. Я что-то упустил и использования блокировки файлов здесь недостаточно, также необходима обработка потоков.Lock?

Подробнее здесь: https://stackoverflow.com/questions/783 ... python-udf
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»