5 / 5 / 0
Регистрация: 25.09.2017
Сообщений: 478
1

Как запустить несколько экземпляров функции

14.08.2018, 18:11. Показов 3135. Ответов 8

Студворк — интернет-сервис помощи студентам
Здравствуйте! Я хочу запускать несколько экземпляров функции Pi_num__idea2 с разными параметрами, использую несколько процессов и каждый процесс пишет в опр. файл, путь к которому я передаю через аргумент

Python
1
2
3
4
5
from multiprocessing import Process, Pool
 
pool = Pool(11)
    
pool.map(Pi_num__idea2, [('pi', 2),('pi', 3),('pi', 4),('e', 1),('e', 2),('e', 3),('e', 4),('s2', 1),('s2', 2),('s2', 3),('s2', 4)])
У меня на данный момент завис скрипт и никаких файлов по пути нет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.08.2018, 18:11
Ответы с готовыми решениями:

Как запустить несколько экземпляров браузеров в c#?
Начал делать многопоточность, куча проблем. Как работает selenium grid? каким образом на c# можно...

Как запустить несколько экземпляров приложения AUTOPRN.EXE ?
Каким образом можно запустить сразу несколько экземпляров приложения AUTOPRN.EXE ? YupiRex,...

Как в visual studio запустить несколько экземпляров приложения?
сабж.

Реализовать базовый и производный классы. В главной функции создать несколько экземпляров каждого класса и протестироват
Создать класс тройки чисел. Определить конструкторы, деструктор, функции доступа к полям, ввода...

Как сгенерировать несколько экземпляров объекта?
Есть класс рабочий у которого есть поля имя, возраст и т.д. и метод - делать. Нужно сгенерировать...

8
Эксперт Python
5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
14.08.2018, 19:33 2
Методы из multiprocessing так не вызывают. В доках написано - как правильно.
У вас windows? Тогда скрипту обязательно нужна точка входа main.
1
5 / 5 / 0
Регистрация: 25.09.2017
Сообщений: 478
14.08.2018, 20:31  [ТС] 3
Да конечно я через main и вызываю вот так:

Python
1
2
3
4
5
6
7
8
from multiprocessing import Process, Pool
if __name__ == '__main__':
    
    def Pi_num__idea2(method, idea):
        pass
    
    with Pool(processes=11) as pool:
        pool.map(Pi_num__idea2, [('pi', 2),('pi', 3),('pi', 4),('e', 1),('e', 2),('e', 3),('e', 4),('s2', 1),('s2', 2),('s2', 3),('s2', 4)])
А еще если это windows - то следует процессы проинициализировать заранее


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Pi_2 = Process(target=Pi_num__idea2('pi', 2))
Pi_3 = Process(target=Pi_num__idea2('pi', 3))
Pi_4 = Process(target=Pi_num__idea2('pi', 4))
    
E_1 = Process(target=Pi_num__idea2('e', 1))
E_2 = Process(target=Pi_num__idea2('e', 2))
E_3 = Process(target=Pi_num__idea2('e', 3))
E_4 = Process(target=Pi_num__idea2('e', 4))
 
Pi_2.start()
Pi_3.start()
Pi_4.start()
    
E_1.start()
E_2.start()
E_3.start()
E_4.start()
 
Pi_2.join()
Pi_3.join()
Pi_4.join()
    
E_1.join()
E_2.join()
E_3.join()
E_4.join()
но я и так делал - и работал только 1 процесс, - т.е. остальных файлов я не видел в целевой директории.

сделал так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from multiprocessing import Process, Pool
def Pi_num__idea2(method, idea):
        pass
def multiprocessed():
    my_list = [('pi', 2),('pi', 3),('pi', 4),('e', 1),('e', 2),('e', 3),('e', 4),('s2', 1),('s2', 2),('s2', 3),('s2', 4)]
    processes = []
    for i in range(11):
        p = Process(target=Pi_num__idea2, args=my_list[i])
        processes.append(p)
    # Start the processes
    for p in processes:
        p.start()
    # Ensure all processes have finished execution
    for p in processes:
        p.join()
 
if __name__ == '__main__':
    
    multiprocessed()
Если их через цикл стартовать, что таким вот образом как последнее выше - то работает. Они все писатели в разные файлы, поэтому данные там никак не общие. Все норм.))
0
Эксперт Python
5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
14.08.2018, 21:07 4
Вот пример с map, который вполне себе работает.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from multiprocessing import Pool
import os
 
addresses = ['yandex.ru', 'не_существует.ru', 'rambler.ru'] * 100
 
def ping(ip):
    res = os.system("ping -n 1 " + ip +'>nul')
    return (ip,res)
 
def multi_ping(workers,func):
    pool = Pool(workers)
    results = pool.map(func, addresses)
    
    for r in results:
       print(r)
    
    pool.close()
    pool.join() 
    
if __name__ == '__main__':   
    multi_ping(10,ping)
0
5 / 5 / 0
Регистрация: 25.09.2017
Сообщений: 478
14.08.2018, 21:58  [ТС] 5
Ой, нет, результаты лучше в консоль не выводить - там много данных и память переполнится.

Только вот почему то некоторые процессы сделали лишь 2 записи и на это пока все. Тогда как другие сделали намного больше. О чем это говорит?
0
5 / 5 / 0
Регистрация: 25.09.2017
Сообщений: 478
15.08.2018, 11:21  [ТС] 6
Garry Galler, а вы это в Unix системе запускали - ваш код последний?
0
Эксперт Python
5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
17.08.2018, 00:10 7
Цитата Сообщение от Alex_py Посмотреть сообщение
вы это в Unix системе запускали
Естественно, нет. Здесь явно указана виндовая функция ping. У линуксовой другой формат опций.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
17.08.2018, 00:13 8
Цитата Сообщение от Garry Galler Посмотреть сообщение
У вас windows? Тогда скрипту обязательно нужна точка входа main.
Чего ?
0
Эксперт Python
5416 / 3840 / 1214
Регистрация: 28.10.2013
Сообщений: 9,554
Записей в блоге: 1
17.08.2018, 01:49 9
Цитата Сообщение от Avazart Посмотреть сообщение
Чего ?
Точка входа в приложение. Аналог main в С\С++.
Требуется для правильного multiprocessing'а на windows.
Если непонятно - поищите в документации python.

Добавлено через 31 минуту
P.S. Без блока if __name__ == "__main__" "форкнутый" (виндовым способом) подпроцесс запустит код еще раз, а потом еще раз... и будет как в песне: "эх, раз, еще раз, еще много много раз".
С блоком - условие выполнится только в родительском процессе. А в дочерних __name__ модуля будет равно '__mp_main__'.
shsv недавно об этом упоминал в аналогичной теме.
1
17.08.2018, 01:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.08.2018, 01:49
Помогаю со студенческими работами здесь

Как хранить несколько экземпляров класса с их свойствами?
Есть у нас класс - овощи объект - овощ: картошка, огурец, морковь у них есть свойства - цвет,...

Как открыть в MDI форму MDIChild в несколько экземпляров?
Подскажите как можно открыть в MDI форму MDIChild в несколько экземпляров... Т.е. У меня есть...

Как запретить запускать несколько экземпляров одной проги?
Напомните, пожалуйста, как запретить запускать несколько экземпляров одной проги. (Например, как...

Как вывести несколько экземпляров одной страницы, с разным данными
Здравствуйте, у меня есть панель, на которой я создаю фреймы и вывожу в них одну и ту же страницу....

Как разрулить несколько работу нескольких экземпляров процесса консольного приложения?
Мне нужно одновременно запустить несколько экземпляров приложения. При этом, чтобы они не мешали...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru