dolphin23
@dolphin23
Новичок в программировании

Multiprocessing.Process OSError: [WinError 87] Параметр задан неверно, что делать?

Есть функция dbl_integral(fn, a1, b1, a2, b2, n1, n2) которая высчитывает двойной интеграл, и массив различных функций от которых и берется интеграл, я прохожусь по циклу и создаю потоки:
for i in range(len(a1)):
    p = Process(target=dbl_integral, args=(fn[i], a1[i], b1[i], a2[i], b2[i], n1[i], n2[i],))
    p.start()
    p.join()

Выдает ошибку:
Traceback (most recent call last):
  File "...\main.py", line 36, in <module>
    p.start()
  File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\multiprocessing\process.py", line 121, in start
    self._popen = self._Popen(self)
  File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\multiprocessing\context.py", line 224, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\multiprocessing\context.py", line 327, in _Popen
    return Popen(process_obj)
  File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\multiprocessing\popen_spawn_win32.py", line 93, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function <lambda> at 0x00000122F23CEB00>: attribute lookup <lambda> on __main__ failed   
PS C:\Users\admin\Desktop\dev\coursework2> Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "C:\Users\admin\AppData\Local\Programs\Python\Python310\lib\multiprocessing\spawn.py", line 102, in spawn_main
    source_process = _winapi.OpenProcess(
OSError: [WinError 87] Параметр задан неверно

Что это может быть?
  • Вопрос задан
  • 680 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Ну так тебе же говорят:
_pickle.PicklingError: Can't pickle <function <lambda> at 0x00000122F23CEB00>: attribute lookup <lambda> on __main__ failed

Для передачи данных в соседний процесс они сериализуются через модуль pickle. А сериализовываться так может далеко не всё.
Если тебе нужно скинуть в соседний процесс код... это проблема. Может, получится скинуть словарь с локальными переменными, строку с кодом, и вычислить эту строку через eval() уже "на месте".
Альтернативно, просто замени лямбду на нормальную функцию, и попробуй передать либо её, либо имя этой функции, чтобы дочерний процесс сам её взял из globals() или еще откуда.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы