2015-01-24 2 views
-1

У меня есть функция, например:Python многопроцессорной функция

launcher(usr_login, usr_password) 

, который вызывает другой питон скрипт + usr_login + usr_password в качестве аргументов.

См: Функции

launcher("login", "pass") 

выполнит файл function.py в $function.py login pass
Темы: У меня есть Dict user_login: пароль, и я хотел бы иметь возможность запускать функцию «запуск» в одном время многопоточное/многопроцессорное

dict имеет login1: pass1, login2: pass2 Так что мне нужно запустить пусковую установку (login1, pass1) и запуск (login2, pass2) за это же время. Есть ли способ, как это сделать? Спасибо

# -*- coding: utf-8 -*- 
from config import users, ThCount 
from time import sleep 
from multiprocessing import Pool 
import os 

users = {} 

def launcher(usr_login, usr_password): 
    os.system("C:\\Python34\\python.exe implementation.py %s %s" % (usr_login, usr_password)) 

Ответить на комментарий # 1 Если я использую так:

def launcher(usr_login, usr_password): 
    os.system("C:\\Python34\\python.exe implementation.py %s %s" % (usr_login, usr_password)) 
if __name__ == '__main__': 
    with Pool(5) as p: 
     p.map(launcher, users) 

я получил:

TypeError: launcher() missing 1 required positional argument: 'usr_password' 
+0

RTFM https://docs.python.org/3/library/multiprocessing.html – Cthulhu

+0

если __name__ == '__main__': с бассейном (Int (ThCount)) как р: p.map (пусковая установка, пользователи) Я тестировал его раньше. Не работает. Похоже, функция не была вызвана. –

ответ

3

Вы не можете передать несколько аргументов в функции, используя Pool.map() ,

В качестве простого решения вы можете упаковать их в кортеж.

# -*- coding: utf-8 -*- 
from multiprocessing import Pool 
import os 

users = { 
    'a': '1', 
    'b': '2', 
    'c': '3' 
} 

def launcher(args): 
    os.system("python implementation.py %s %s" % (args[0], args[1])) 


if __name__ == '__main__': 
    with Pool(3) as p: 
     p.map(launcher, users.items()) 

UPD Я заметил, что вы используете Python 3.4. Начиная с версии 3.3 вы можете использовать Pool.starmap для передачи нескольких параметров и, следовательно, сохранить список параметров, читаемых по-прежнему.

# -*- coding: utf-8 -*- 
from multiprocessing import Pool 
import os 

users = { 
    'a': '1', 
    'b': '2', 
    'c': '3' 
} 

def launcher(usr_login, usr_password): 
    os.system("python implementation.py %s %s" % (usr_login, usr_password)) 


if __name__ == '__main__': 
    with Pool(3) as p: 
     p.starmap(launcher, users.items()) 
+0

да! То, что я искал. Вы сделали это решение. Спасибо. –

+0

Добро пожаловать. См. Часть UPD, это лучшее решение IMHO. –

+0

вы можете использовать Pool.starmap, чтобы он был читабельным, как и раньше. Что это значит? У меня нет выхода. Функция просто запускает Selenium WebDriver и заходит на сайт. В любом случае спасибо. –

Смежные вопросы