17-向线程的目标函数传递参数
17.6.1 向线程的目标函数传递参数
如果想让在新线程中运行的目标函数有参数,那么可以将目标函数的参数传入 threading. Thread() 。例如,假设想在自己的线程中运行以下 print() 调用:
>>> print('Cats', 'Dogs', 'Frogs', sep=' & ')
Cats & Dogs & Frogs
该 print() 调用有3个常规参数: 'Cats' 、 'Dogs' 和 'Frogs' 。还有一个关键字参数: sep=' & ' 。常规参数可以作为一个列表,传递给 threading.Thread() 中的 args 关键字参数。关键字参数可以作为一个字典,传递给 threading.Thread() 中的 kwargs 关键字参数。
在交互式环境中输入以下代码:
>>> import threading
>>> threadObj = threading.Thread(target=print, args=['Cats', 'Dogs', 'Frogs'],
kwargs={'sep': ' & '})
>>> threadObj.start()
Cats & Dogs & Frogs
为了确保参数 'Cats' 、 'Dogs' 和 'Frogs' 传递给新线程中的 print() ,我们将 args=['Cats', 'Dogs', 'Frogs'] 传入 threading.Thread() 。为了确保关键字参数 sep=' & ' 传递给新线程中的 print() ,我们将 kwargs={'sep': '& '} 传入 threading.Thread() 。
threadObj.start() 调用将创建一个新线程来调用 print() 函数,它会传入 'Cats' 、 'Dogs' 和 'Frogs' 作为参数,并传入 ' & ' 作为 sep 关键字参数。
下面所列的创建新线程调用 print() 的方法是不正确的:
threadObj = threading.Thread(target=print('Cats', 'Dogs', 'Frogs', sep=' & '))
这行代码最终会调用 print() 函数,并将它的返回值( print() 的返回值总是 None )作为 target 关键字参数。它没有传递 print() 函数本身。如果要向新线程中的函数传递参数,就要使用 threading.Thread() 函数的 args 和 kwargs 关键字参数。