Найти - Пользователи
Полная версия: Выполнение функций в multiprocessing
Начало » Python для новичков » Выполнение функций в multiprocessing
1
kvn
Добрый день!
Имею две функции.
Требуется выполнять каждую из них циклически.
Как это можно реализовать такое через multiprocessing Process?
Если в функциях создаю while, то запуская каждую как самостоятельный процесс получаю выполнение кода в каждой из функций один раз.
ZerG
Сектор приз на барабане! Внесите черный йасчик !!
(код в студию пожалуйста)
kvn
Код вот такой простенький создал (не понимаю пока - может не правильный) -
 from multiprocessing import Process
import os
def W(y):
    while(True):
        y = y + 100
        config.X_1 = os.getpid()
        print(('process id:', os.getpid()))
        print(config.X_1)
        time.sleep(1)
        print(time.time())
        return y*y
def f(x):
    while(True):
        x = x + 100
        config.X_2 = os.getpid()
        print(('process id:', os.getpid()))
        print(config.X_2)
        time.sleep(1)
        print(time.time())
        return x*x
if __name__ == '__main__':
    p = Process(target=f, args=(10,))
    print(p)
    p.start()
    p.join()
    print(p, p.is_alive())
    p = Process(target=W, args=(20,))
    print(p)
    p.start()
    p.join()
    print(p, p.is_alive())

Получаю результат -
Running: C:\project Python\Simulator_modbusTCP\start.py (Fri Aug 26 15:28:51 2016)

<Process(Process-1, initial)>
('process id:', 5556)
5556
1472207333.298027
<Process(Process-1, stopped)> False
<Process(Process-2, initial)>
('process id:', 7160)
7160
1472207334.50223
<Process(Process-2, stopped)> False
ZerG
Да все у вас правильно

 # -*- coding: utf-8 -*-
from multiprocessing import Process
import os
import time
def W(y):
    while(True):
        y = y + 1
        config1 = os.getpid()
        print(('process id:', os.getpid()))
        print(config1)
        time.sleep(1)
        print(time.ctime())
        print(y * y)
def f(x):
    while(True):
        x = x + 2
        config2 = os.getpid()
        time.sleep(1)
        print(time.ctime())
        print(x * x)
       
if __name__ == '__main__':
    p1 = Process(target=f, args=(10,))
    p2 = Process(target=W, args=(20,))
    # print(p1)
    p1.start()
    p2.start()
    
kvn
Но код функций выполняется только один раз, а не в циклически.
Убрал while в функциях.
Добавил run() в процессах и заработало выполнение функций в цикле, причем id стал одинаковый у обоих функций!
Наверное я на правильном пути?
 from multiprocessing import Process
import os
def W(y):
    #while(True):
    y = y + 100
    time.sleep(1)
    print(('W process id:', os.getpid(), time.time()))
    return y*y
def f(x):
    #while(True):
    x = x + 100
    time.sleep(1)
    print(('f process id:', os.getpid(), time.time()))
    return x*x
if __name__ == '__main__':
    p1 = Process(target=f, args=(10,))
    print(p1)
    p2 = Process(target=W, args=(20,))
    print(p2)
    p1.start()
    p2.start()
    while(True):
        p1.run()
        p2.run()

Running: C:\project Python\Simulator_modbusTCP\start.py (Fri Aug 26 16:46:22 2016)

<Process(Process-1, initial)>
<Process(Process-2, initial)>
('f process id:', 10480, 1472211983.603324)
('f process id:', 9308, 1472211983.728124)
('W process id:', 10328, 1472211983.759324)
('W process id:', 10480, 1472211984.603726)
('f process id:', 10480, 1472211985.617728)
('W process id:', 10480, 1472211986.63173)
('f process id:', 10480, 1472211987.645731)
('W process id:', 10480, 1472211988.659733)
ZerG
С чего вы решили что один раз?
Вот вывод с того кода что я выложил

 ('process id:', 33313)
33313
Fri Aug 26 14:52:10 2016
441
('process id:', 33313)
33313
Fri Aug 26 14:52:10 2016
144
Fri Aug 26 14:52:11 2016
196
Fri Aug 26 14:52:11 2016
484
('process id:', 33313)
33313
Fri Aug 26 14:52:12 2016
529
Fri Aug 26 14:52:12 2016
('process id:', 33313)
33313
256
Fri Aug 26 14:52:13 2016
576
Fri Aug 26 14:52:13 2016
('process id:', 33313)
33313
324
Fri Aug 26 14:52:14 2016
625
Fri Aug 26 14:52:14 2016
('process id:', 33313)
33313
400
Fri Aug 26 14:52:15 2016
676
Fri Aug 26 14:52:15 2016
('process id:', 33313)
33313
484
Fri Aug 26 14:52:16 2016
Fri Aug 26 14:52:16 2016
729
576
('process id:', 33313)
33313
Fri Aug 26 14:52:17 2016
Fri Aug 26 14:52:17 2016
676
784
('process id:', 33313)
33313
[Cancelled]
kvn
Странно, ввел Ваш код, Running выполняется.
А вывод пустой.
Похоже у меня NINJA-IDE не успевает с выводом данных.
Или что то другое не дает?
В других скриптах вывод работает нормально.
kvn
Подождал выполнение минут пять - увидел небольшой кусок выполнения.
И снова пусто.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB