Python 多处理函数

Python Multiprocessing function

我有一个函数,例如:

launcher(usr_login, usr_password)

调用其他 python 脚本 + usr_login + usr_password 作为参数。

见: 函数

launcher("login", "pass")

将执行 function.py 文件作为 $function.py login pass
主题: 我有 dict user_login :密码,我希望能够在一次多线程/多处理

中启动一个 'launcher' 函数

dict 有 login1 : pass1 , login2 : pass2 所以我需要同时启动 launcher(login1, pass1) 和 launcher(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'

您不能使用 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())