Python 3.4多线程并传递变量

时间:2016-06-01 12:41:26

标签: python multithreading python-3.x python-3.4

所以我从来没有真正善于多线程,今天我遇到了一个问题,我一直试图躲闪一段时间。

我想将变量传递给我在多个线程中执行的函数,但我不知道如何以函数方式执行此操作。

这是我做的:

       # This is the thread starter
    a = 0
    while a < threads :
        a +=1
        print("[" + str(a) + "/" + str(threads)+ "] Thread started")
        thread = myThread(payload=payload) # payload is the variable I'd like to pass
        thread.start()

这是班级:

 class myThread (threading.Thread):
 def __init__(self):
     threading.Thread.__init__(self)
 def run (self, payload) :
     Checker(payload)

这就是我得到的错误:

TypeError: __init__() got an unexpected keyword argument 'payload'

如果有人无法告诉我自己做错了什么,我会感到高兴。先谢谢你们!

2 个答案:

答案 0 :(得分:1)

您应该阅读有关python中Classes的更多信息。

您忘记在payload实施的构造函数中定义Thread参数。 这很简单:

class myThread (threading.Thread):
    def __init__(self, payload):  # you have to define the constructor parameter here
        threading.Thread.__init__(self)
        self.payload = payload
    def run (self):
        Checker(self.payload)

如果您在自己的Thread实施中不需要一些额外的东西,那么您可以这样做:

a = 0
while a < threads:
    a +=1
    print("[{0!s}/{1!s}] Thread started".format(a, threads))
    thread = Thread(target=Checker, args=(payload,))
    thread.start()

答案 1 :(得分:1)

TryToSolveItSimple的答案是正确的,但值得注意的是,这是一个非常常见的模式,已经存在一个原语:

from multiprocessing.pool import ThreadPool
from contextlib import closing

def Checker(a):
    print(a)

threads = 4
with closing(ThreadPool(threads)) as pool:
    pool.map(Checker, range(threads))

这将并行打印数字0到3。

with closing部分对于此工作并不是绝对必要的,但是就像文件一样,当你完成它时应该关闭一个池。