Почему модуль многопроцессорности не дает желаемого результата? - PullRequest
0 голосов
/ 28 мая 2020

введите здесь описание изображения импортируйте многопроцессорность как mp import os

def cube(num):
    print(os.getpid())
    print("Cube is {}".format(num*num*num))

def square(num):
    print(os.getpid())
    print("Square is {}".format(num*num))

if __name__ == "__main__":
    p1 = mp.Process(target = cube, args = (3,))
    p2 = mp.Process(target = square, args = (4,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print("Done")

введите описание изображения здесь enter image description here

Я использовал модуль multiprocessing, но я не могу распечатать какой-либо вывод из функции, использующей его.

Я даже попытался очистить stdout с помощью sys модуль.

1 Ответ

0 голосов
/ 28 мая 2020

Q : «Почему multiprocessing модуль не дает желаемого результата? »

Почему ?

Потому что он вылетает.

MWE / MCVE-представление проблемы содержит неправильный код. Он вылетает и не имеет ничего общего с sys.stdout.flush():

>>> cube(  4 )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in cube
NameError: global name 'os' is not defined

Решение:

>>> import os   # be it in the __main__ or in the def()-ed functions...

>>> cube(  4 )
14165
Cube is 64

и mp.Process() на основе реплики экземпляров python -процесса тоже перестанут давать сбой.


Работающий MCVE:

(base) Fri May 29 14:29:33 $ conda activate py3
(py3) Fri May 29 14:34:55 $ python StackOverflow_mp.py
This is ____6745::__main__
This is ____6746::PID
This is ____6747::PID
Cube(__3) is _______27.
Square(__4) is _______16.
Done.
Works.
Q.E.D.

import multiprocessing as mp
import os
import sys
import time

def cube( num ):
    print( "This is {0:_>8d}::PID".format( os.getpid() ) )
    print( "Cube({0:_>3d}) is {1:_>9d}.".format( num, num*num*num ) )
    sys.stdout.flush()

def square( num ):
    print( "This is {0:_>8d}::PID".format( os.getpid() ) )
    print( "Square({0:_>3d}) is {1:_>9d}.".format( num, num*num ) )
    sys.stdout.flush()

if __name__ == "__main__":
    print( "This is {0:_>8d}::__main__".format( os.getpid() ) )
    p1 = mp.Process( target = cube,   args = (3, ) )
    p2 = mp.Process( target = square, args = (4, ) )
    p1.start()
    p2.start()
    p1.join()
    p2.join()

    time.sleep( 1 )

    print( "Done.\nWorks.\nQ.E.D." )

Я скопировал и вставил ваш точный код. Но я все еще не получал вывода от вызываемых функций с использованием многопроцессорных библиотек
- Kartikeya Agarwal 47 минут a go

Итак,
- я открыл новый процесс терминала,
- я скопировал команду conda activate py3 и
- я нажал Enter , чтобы он запустился, поэтому как сделать python3 экосистему go живую.
- Я снова запустил доказательство решения python StackOverflow_mp.py и
- Я нажал Введите , чтобы запустить
- Я видел, как это работает точно так же, как и в прошлый раз.
- Я сомневаюсь, что проблема находится на стороне предоставленного дважды (повторно) подтвержденного доказательства решения, не так ли?
QED

(py3) Fri May 29 19:53:58 $ python StackOverflow_mp.py
This is ___27202::__main__
This is ___27203::PID
Cube(__3) is _______27.
This is ___27204::PID
Square(__4) is _______16.
Done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...