所以我从来没有真正善于多线程,今天我遇到了一个问题,我一直试图躲闪一段时间。
我想将变量传递给我在多个线程中执行的函数,但我不知道如何以函数方式执行此操作。
这是我做的:
# 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'
如果有人无法告诉我自己做错了什么,我会感到高兴。先谢谢你们!
答案 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
部分对于此工作并不是绝对必要的,但是就像文件一样,当你完成它时应该关闭一个池。