Ошибка многопроцессорной обработки Python с IBM API (Q Experience)

Я пытаюсь использовать API-интерфейс IBM Q Experience, установил библиотеку и написал быстрый тестовый код. Сначала он не мог найти модуль. Затем я добавил всю системную вещь. По общему признанию, я только что скопировал это из сообщения stackoverflow, так что это может быть проблемой. В любом случае, я получил «Ошибку времени выполнения», которая приводит к многопроцессорной библиотеке Python. У IBM Q нет большого сообщества, поэтому после небольшого исследования я ничего не смог найти. Я совершенно не знаком с многопроцессорностью, многопоточностью и т. д., поэтому я думаю, что просто увидеть код и ошибку будет лучше, чем что-либо, что я могу объяснить. Заранее спасибо.

import sys
sys.path.append("../../")

from qiskit import QuantumProgram

#visualization
from tools.visualization import plot_histogram

#set up registers
qp = QuantumProgram()
q = qp.create_quantum_register("q", 3)
c = qp.create_classical_register("c", 3)

#define our circuit
threeQ = qp.create_circuit("threeQ", [q], [c])
threeQ.measure(q[0], c[0])
threeQ.measure(q[1], c[1])
threeQ.measure(q[2], c[2])

#run
result = qp.execute(["threeQ"])

#plot
plot_histogram(result.get_counts("threeQ"))

Ошибка, которую я получаю (извините, она длинная):

Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 106, in spawn_main
    exitcode = _main(fd)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 115, in _main
    prepare(preparation_data)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 226, in prepare
    _fixup_main_from_path(data['init_main_from_path'])
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 278, in _fixup_main_from_path
    run_name="__mp_main__")
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\runpy.py", line 254, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\Everybody\firstquantum.py", line 21, in <module>
    print(qp.execute(["threeQ"]))
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\site-packages\qiskit\_quantumprogram.py", line 1413, in execute
    result = self.run(qobj, wait=wait, timeout=timeout)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\site-packages\qiskit\_quantumprogram.py", line 1232, in run
    timeout=timeout)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\site-packages\qiskit\_quantumprogram.py", line 1315, in _run_internal
    job_processor.submit()
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\site-packages\qiskit\_jobprocessor.py", line 118, in submit
    future = executor.submit(run_backend, q_job)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\concurrent\futures\process.py", line 454, in submit
    self._start_queue_management_thread()
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\concurrent\futures\process.py", line 415, in _start_queue_management_thread
    self._adjust_process_count()
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\concurrent\futures\process.py", line 434, in _adjust_process_count
    p.start()
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\context.py", line 212, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\context.py", line 313, in _Popen
    return Popen(process_obj)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\popen_spawn_win32.py", line 34, in __init__
    prep_data = spawn.get_preparation_data(process_obj._name)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 144, in get_preparation_data
    _check_not_importing_main()
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 137, in _check_not_importing_main
    is not going to be frozen to produce an executable.''')
RuntimeError:
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 106, in spawn_main
    exitcode = _main(fd)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 115, in _main
    prepare(preparation_data)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 226, in prepare
    _fixup_main_from_path(data['init_main_from_path'])
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 278, in _fixup_main_from_path
    run_name="__mp_main__")
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\runpy.py", line 254, in run_path
    pkg_name=pkg_name, script_name=fname)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Users\Everybody\firstquantum.py", line 21, in <module>
    print(qp.execute(["threeQ"]))
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\site-packages\qiskit\_quantumprogram.py", line 1413, in execute
    result = self.run(qobj, wait=wait, timeout=timeout)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\site-packages\qiskit\_quantumprogram.py", line 1232, in run
    timeout=timeout)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\site-packages\qiskit\_quantumprogram.py", line 1315, in _run_internal
    job_processor.submit()
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\site-packages\qiskit\_jobprocessor.py", line 118, in submit
    future = executor.submit(run_backend, q_job)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\concurrent\futures\process.py", line 454, in submit
    self._start_queue_management_thread()
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\concurrent\futures\process.py", line 415, in _start_queue_management_thread
    self._adjust_process_count()
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\concurrent\futures\process.py", line 434, in _adjust_process_count
    p.start()
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\process.py", line 105, in start
    self._popen = self._Popen(self)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\context.py", line 212, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\context.py", line 313, in _Popen
    return Popen(process_obj)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\popen_spawn_win32.py", line 34, in __init__
    prep_data = spawn.get_preparation_data(process_obj._name)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 144, in get_preparation_data
    _check_not_importing_main()
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 137, in _check_not_importing_main
    is not going to be frozen to produce an executable.''')
RuntimeError:
        An attempt has been made to start a new process before the
        current process has finished its bootstrapping phase.

        This probably means that you are not using fork to start your
        child processes and you have forgotten to use the proper idiom
        in the main module:

            if __name__ == '__main__':
                freeze_support()
                ...

        The "freeze_support()" line can be omitted if the program
        is not going to be frozen to produce an executable.
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 106, in spawn_main
    exitcode = _main(fd)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 115, in _main
    prepare(preparation_data)
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 226, in prepare
    _fixup_main_from_path(data['init_main_from_path'])
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\multiprocessing\spawn.py", line 278, in _fixup_main_from_path
    run_name="__mp_main__")
  File "C:\Users\Everybody\AppData\Local\Programs\Python\Python35\lib\runpy.py", line 254, in run_path
ERROR

person Riley Fitzpatrick    schedule 25.01.2018    source источник
comment
К сожалению, я использую Linux и не могу воспроизвести вашу проблему. Однако я советую вам попробовать Python3 из Anaconda. Вам также необходимо исправить один из импортов как from qiskit.tools.visualization import plot_histogram.   -  person Alexander Pozdneev    schedule 26.01.2018
comment
Спасибо, у меня была ошибка с plot_histogram. Итак, под python3 w anaconda вы подразумеваете установку новейшего python с помощью anaconda? Спасибо   -  person Riley Fitzpatrick    schedule 26.01.2018
comment
Правильно, я предлагаю использовать Anaconda в качестве среды Python3 и установить QISKit с помощью pip install qiskit в Anaconda Prompt.   -  person Alexander Pozdneev    schedule 26.01.2018
comment
К сожалению, я получил очень похожую, но не идентичную ошибку. Я предполагаю, что разница только в том, что она находится в среде Python. Единственная главная вещь, которую я заметил, была другой, это последний бит:   -  person Riley Fitzpatrick    schedule 26.01.2018
comment
Файл C:\Users\Everybody\Anaconda3\envs\py36\lib\concurrent\futures_base.py, строка 357, в __get_result поднять self._exception concurrent.futures.process.BrokenProcessPool: процесс в пуле процессов был внезапно прерван во время будущее было запущено или ожидалось.   -  person Riley Fitzpatrick    schedule 26.01.2018
comment
Я пробовал Win7: Anaconda3 5.0.1 + pip install qiskit в Anaconda Prompt, и ваша программа работала даже без import sys. Итак, не могли бы вы подробнее рассказать о своей среде. Какая у вас версия ОС? Как установить QISKit? Как вы запускаете программу (ноутбук Jupyter?)?   -  person Alexander Pozdneev    schedule 27.01.2018
comment
Моя ОС — Windows 10 Домашняя версия 10.0.16299. Я использую Sublime Text Editor и после вашего совета переустановил qiskit, используя новую среду python 3.6 в anaconda. (сделано с использованием conda create -n py36 python=3.6 anaconda) Я запустил программу через приглашение анаконды, а не через командную строку.   -  person Riley Fitzpatrick    schedule 27.01.2018
comment
Извините, забыл добавить, что версия анаконды 4.3.14. Если я обновлю Anaconda, мне нужно будет воссоздать среду?   -  person Riley Fitzpatrick    schedule 27.01.2018
comment
Теперь это работает. Спасибо Александр!   -  person Riley Fitzpatrick    schedule 27.01.2018


Ответы (1)


Это общая проблема с многопоточностью в Python в Windows. Решение состоит в том, чтобы поместить код верхнего уровня в блок if __name__ == "__main__", например:

if __name__ == '__main__':
    <your code here>

Надеюсь, это поможет!

person Doug McClure    schedule 26.01.2018
comment
Большое спасибо! Я довольно неопытен в Python, но если у вас есть минутка, мне любопытно, что вызвало ошибку. Еще раз спасибо Дуг! - person Riley Fitzpatrick; 27.01.2018
comment
Я тоже не эксперт по Python, но вы можете узнать больше об этой проблеме здесь среди других мест. - person Doug McClure; 28.01.2018