Как я могу безопасно использовать многопроцесскую в приложении Django?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу безопасно использовать многопроцесскую в приложении Django?

Сообщение Anonymous »

Я прочитал документы, предполагающие, что многопроцессорная передача может вызвать непреднамеренные побочные эффекты в приложениях Django или в Windows, особенно тех, которые подключены к нескольким базам данных. В частности, я использую функцию, load_to_table , для создания нескольких файлов CSV из DataFrame, а затем загружать данные в таблицу PostgreSQL, используя многопроцесс. Эта функция глубоко интегрирована в мое приложение Django и не является автономным сценарием. < /P>
Я обеспокоен потенциальными долгосрочными последствиями, если этот код используется в производстве. Кроме того, если __name__ == '__main __': , похоже, не работает в глубоких файлах/функциях Django. Это связано с тем, что команды управления Django выполняются в другом контексте, где __name __ не установлен на «__main __» , что предотвращает выполнение этого блока, как и ожидалось. Более того, многопроцессорные рекомендации рекомендуют использовать if __name__ == '__main __': для безопасной инициализации многопроцессорных задач, поскольку он гарантирует, что код не случайно выполняется несколько раз, особенно на платформах, таких как Windows, где код на уровне модуля повторно распределен в детских процессах. class = "lang-py prettyprint-override">

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

import os
import glob
from multiprocessing import Pool, cpu_count
from functools import partial
from portal.db_postgresql.connection import Connection

def copy_to_table(file_name: str, table_name: str, columns: list):
# custom connection class
connection_obj = Connection(get_current_db_name(), 1, 1)
connection = connection_obj.connection()
cursor = connection.cursor()
with open(file_name, "r") as f:
cursor.copy_from(f, table_name, sep=",", columns=columns, null="")
connection.commit()
connection.close()
return file_name

# df_ops is a custom PySpark dataframe class
def load_to_table(df_ops: PySparkOperations, table_name: str) -> dict:
filepath = os.path.join("uploaded_files", table_name)
df_ops.df.repartition(10).write.mode("overwrite").format("csv").option("header", "false").save(filepath)
file_path_list = sorted(glob.glob(f"{filepath}/*.csv"))
with Pool(cpu_count()) as p:
p.map(partial(copy_to_table, table_name=table_name, columns=df_ops.df.columns), file_path_list)
return df_ops.count
Функция выше не работает с отладчиком VS -кода, скорее всего, из -за Debugpy , что мешает многопроцессор Django. Тем не менее, он работает с Runserver . Когда я запускаю приложение Django с отладчиком VS -кода, я сталкиваюсь с следующей ошибкой при выполнении функции. Кажется, он работает в петлях. < /P>

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

File "/usr/lib/python3.11/multiprocessing/process.py", line 121, in start
self._popen = self._Popen(self)
^^^^^^^^^^^^^^^^^
File "/home/rhythmflow/Desktop/Reconciliation/reconciliation-backend-v3/portal/operations/load_data/methods.py", line 225, in load_to_table
with Pool(cpu_count()) as p:
^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/multiprocessing/context.py", line 281, in _Popen
return Popen(process_obj)
^^^^^^^^^^^^^^^^^^
File "/home/rhythmflow/Desktop/Reconciliation/reconciliation-backend-v3/portal/operations/load_data/load_data.py", line 71, in start
load_to_table(df_ops, self.source_tmp_details)
File "/usr/lib/python3.11/multiprocessing/context.py", line 119, in Pool
return Pool(processes, initializer, initargs, maxtasksperchild,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

File "/home/rhythmflow/.vscode/extensions/ms-python.debugpy-2024.10.0-linux-x64/bundled/libs/debugpy/_vendored/pydevd/pydevd.py", line 838, in wait_for_ready_to_run
self._py_db_command_thread_event.wait(0.1)
File "/usr/lib/python3.11/threading.py", line 629, in wait
signaled = self._cond.wait(timeout)
^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/threading.py", line 331, in wait
gotit = waiter.acquire(True, timeout)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/rhythmflow/Desktop/Reconciliation/reconciliation-backend-v3/.venv/lib/python3.11/site-packages/django/utils/autoreload.py", line 664, in 
signal.signal(signal.SIGTERM, lambda *args: sys.exit(0))
SystemExit: 0
[22/Aug/2024 15:04:30] "POST /start-process/ HTTP/1.1" 500 59
[22/Aug/2024 15:04:35,063] - Broken pipe from ('127.0.0.1', 51102)
Что может вызвать эту проблему, и как я могу решить ее при использовании отладчика VS -кода?

Подробнее здесь: https://stackoverflow.com/questions/789 ... django-app
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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