當前位置:成語大全網 - 新華字典 - Python 多線程傳參問題

Python 多線程傳參問題

下面是從python ?threading模塊摘錄下來的

class threading.Thread(group=None, target=None,

name=None, args=(), kwargs={})

args is the argument tuple for the target invocation. Defaults to

().

kwargs is a dictionary of keyword arguments for the target

invocation. Defaults to {}.

簡單的說就是,線程函數的參數要麽是tuple類型要麽是dict類型,既然python文檔上已經規定好了,那麽就是不能變了,除非重大的版本升級,棄用現在這種方式,不過這是不可能的,再者可以查看threading.Thread類的初始化代碼

class?Thread(_Verbose):

def?__init__(self,?group=None,?target=None,?name=None,

args=(),?kwargs=None,?verbose=None):

assert?group?is?None,?"group?argument?must?be?None?for?now"

_Verbose.__init__(self,?verbose)

if?kwargs?is?None:

kwargs?=?{}

self.__target?=?target

self.__name?=?str(name?or?_newname())

self.__args?=?args

self.__kwargs?=?kwargs

self.__daemonic?=?self._set_daemon()

self.__ident?=?None

self.__started?=?Event()

self.__stopped?=?False

self.__block?=?Condition(Lock())

self.__initialized?=?True

#?sys.stderr?is?not?stored?in?the?class?like

#?sys.exc_info?since?it?can?be?changed?between?instances

self.__stderr?=?_sys.stderr

看到上面的args和kwargs的賦值情況嗎,妳不能像**kwargs這樣來傳參的。

從上面來看,妳要使用多線程妳就必須遵守這個約定,線程函數參數要麽是tuple,要麽是字典,沒辦法改進。非要改進那就是使用全局變量,不用傳參,但是如果是這樣的話會涉及到線程安全的問題或者叫數據同步問題,如果不加鎖或者其他互斥量的話這個問題會很嚴重。所以還是遵守規定吧