Nano Hash - криптовалюты, майнинг, программирование

Как инициализировать многопроцессорный процесс Python, цель которого не принимает аргументы?

грубый код:

from multiprocessing import Process

def getPAprofilesPages():
    #do stuff here

def getPBprofilesPages():       
    #do stuff here

P1 = Process(target = getPAprofilesPages, args = [] )
P2 = Process(target = getPBprofilesPages, args = [] )

Обратите внимание, что функции не принимают аргументов. Я пытался установить аргументы равными None, (), (,) и [], как показано выше, а также полностью исключить их из инициализации. В любом случае, я получаю ту же ошибку при попытке запустить P1.start() или P2.start() в интерпретаторе:

>>> Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\******\AppData\Local\Programs\Python\Python37\lib\multiprocessing\spawn.py", line 105, in spawn_main
    exitcode = _main(fd)
  File "C:\Users\******\AppData\Local\Programs\Python\Python37\lib\multiprocessing\spawn.py", line 115, in _main
    self = reduction.pickle.load(from_parent)
AttributeError: Can't get attribute 'getPAprofilesPages' on <module '__main__' (built-in)>

  • возможно, создайте функцию с аргументом и просто не используйте этот аргумент в функции def getPAprofilesPages(arg):. ИЛИ, может быть, проблема в другом месте. 17.10.2019
  • В Linux Mint это работает без аргументов. Я даже могу использовать Process(target=getPAprofilesPages). И он также работает непосредственно в оболочке Python. Насколько я знаю, некоторым системам может потребоваться if __name__ == '__main__': для правильной работы. 17.10.2019
  • Я пробовал это в Windows с __name__ == '__main__' и без него, оба раза я получаю ту же ошибку, что и @Alexander. 17.10.2019
  • Это интересно знать. name определенно является main, так как я выполняю скрипт напрямую. Попробую это в системе Linux и свяжусь с вами. 17.10.2019

Ответы:


1

Следующий код отлично работает в скрипте



def main():
    ...
    all your other code goes here
    ... 
    from multiprocessing import Process
    P1 = Process(target = getPAprofilesPages )
    P2 = Process(target = getPBprofilesPages )
    P1.start()
    P2.start()

def getPAprofilesPages():
    #do stuff here
    pass

def getPBprofilesPages():
    #do stuff here
    pass

if __name__ == '__main__':
    main()

Однако вы говорите, что запускаете его в интерпретаторе, и именно здесь ваша проблема заключается в том, что вы не можете использовать многопроцессорный пакет в интерактивном Python.

Я знаю, что это не тот ответ, который вы искали, но он объясняет вашу ошибку. Вы можете прочитать больше по этой ссылке об обходном пути.

17.10.2019
  • Это не вызывает ошибок, но приводит к тому, что моя вся программа выполняется с самого начала... Я должен отметить, что блок кода в моем исходном сообщении является лишь частью более крупной программы, которая начинается с выполнения в два входа от пользователя. Когда я делаю 17.10.2019
  • @ Александр, тогда я запутался в твоей проблеме. Можете ли вы пересмотреть свой вопрос с дополнительной информацией? 17.10.2019
  • Конечно, я просто преждевременно нажал «Добавить комментарий». Вот моя новая проблема более подробно: это не выдает ошибок, но приводит к тому, что мой весь скрипт выполняется с самого начала... Я должен отметить, что блок кода в моем исходном посте только часть более крупной программы, которая начинается с приема двух входных данных от пользователя. Когда я добавляю это предложение IF над инициализацией и запуском процессов, скрипт выполняется без ошибок, но, опять же, когда достигается P1.start(), он запускает скрипт с самого начала, а не только выполняет назначенные цели . 17.10.2019
  • Ах, хорошо, я понимаю вашу проблему. Находится ли остальная часть вашего кода в функциях или это просто скрипт, не являющийся функцией? 17.10.2019
  • Это просто в сценарии. Никаких функций, кроме двух, определенных специально для действий в качестве целей для процессов, которые я хочу инициализировать. Еще раз, вот что происходит: сценарий начинается с запроса двух входных данных от пользователя, а затем выполняет некоторые действия с указанными входными данными. Два процесса, которые я затем инициализирую, предназначены для выполнения дальнейших действий с полученными данными. Однако, когда программа доходит до части кода P1.start(), она просто выполняет ВЕСЬ скрипт с самого начала, запрашивая два ввода, даже если эта часть скрипта УЖЕ была выполнена. 17.10.2019
  • Я понимаю. Вам нужно, чтобы весь остальной код был в такой функции, как main(), которую я создал в этом ответе. Он обновлен так, что если вы добавите остальную часть своего кода, где он говорит ... all your other code goes here ... , вся ваша программа должна выполняться только один раз. Ваша проблема заключается в том, что весь ваш код не содержится в функции 17.10.2019
  • Если весь ваш код свободно плавает в скрипте, это означает, что каждый дочерний процесс вызывает эту функцию, а затем снова продолжает выполнять остальную часть скрипта. Нет другого способа обойти это, кроме как поместить остальную часть кода в функцию, чтобы каждый дочерний процесс ТОЛЬКО выполнял код в функции, а не остальную часть файла снова. Если вам нужна дополнительная помощь, мы можем создать чат, чтобы продолжить обсуждение этого вопроса. 17.10.2019
  • Давайте продолжим это обсуждение в чате. 17.10.2019
  • Спасибо, похоже, это помогло, и теперь процесс успешно инициализируется и выполняется! Однако, как и в любом подобном случае, возникли новые проблемы. Давайте перейдем к чату, как вы предложили. 18.10.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..