Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 将参数传递给threading.Thread_Multithreading_Python 3.x_Arguments_Parameter Passing - Fatal编程技术网

Multithreading 将参数传递给threading.Thread

Multithreading 将参数传递给threading.Thread,multithreading,python-3.x,arguments,parameter-passing,Multithreading,Python 3.x,Arguments,Parameter Passing,我正在Windows上使用Python 3。我正在使用threading.Thread动态运行一个函数,我可以使用参数或不使用参数来调用它。我正在设置一个列表,第一项是定义路径的字符串。其他参数将是列表中稍后的内容。因此,args可能等于['C:\SomePath'],也可能等于['C:\SomePath','First Argument','Second Argument']。我的电话是这样的: my_script = threading.Thread(target=scr_runner, a

我正在Windows上使用Python 3。我正在使用
threading.Thread
动态运行一个函数,我可以使用参数或不使用参数来调用它。我正在设置一个列表,第一项是定义路径的字符串。其他参数将是列表中稍后的内容。因此,args可能等于
['C:\SomePath']
,也可能等于
['C:\SomePath','First Argument','Second Argument']
。我的电话是这样的:

my_script = threading.Thread(target=scr_runner, args=q_data.data)
my_script.start()
问题是,在调用
threading.Thread
和/或
start
函数的过程中,参数正在丢失其列表特征(
isinstance(q_data.data,str)=False
),但在
scr_runner
函数中,该函数将
script_运行数据
参数,
isinstance(脚本到运行数据,str)=True。

我需要把这个论点一直列在清单上。我该怎么做

我在文档中读到
threading.Thread
函数需要一个元组。将类似于
['C:\SomePath']
的内容转换为元组(在元组中它会变成字符串)是否有问题

提前感谢您的时间

这里是一个MWE:

# coding=utf-8
""" This code tests conversion to list in dynamic calling. """

import threading


def scr_runner(script_to_run_data: tuple) -> None:
    """ This is the function to call dynamically. """
    is_list = not isinstance(script_to_run_data, str)
    print("scr_runner arguments are a list: T/F. " + str(is_list))


my_list=['C:\SomePath']
is_list = not isinstance(my_list, str)
print("About to run script with list argument: T/F. " + str(is_list))
my_script = threading.Thread(target=scr_runner, args=my_list)
my_script.start()
现在,奇怪的是,当我使我的_列表包含更多元素时,我得到了一个错误:

# coding=utf-8
""" This code tests conversion to list in dynamic calling. """

import threading


def scr_runner(script_to_run_data: tuple) -> None:
    """ This is the function to call dynamically. """
    is_list = not isinstance(script_to_run_data, str)
    print("scr_runner arguments are a list: T/F. " + str(is_list))


my_list=['C:\SomePath', 'First Argument', 'Second Argument']
is_list = not isinstance(my_list, str)
print("About to run script with list argument: T/F. " + str(is_list))
my_script = threading.Thread(target=scr_runner, args=my_list)
my_script.start()
产生错误:

About to run script with list argument: T/F. True
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 916, in  
       _bootstrap_inner
    self.run()
  File "C:\ProgramData\Anaconda3\lib\threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
TypeError: scr_runner() takes 1 positional argument but 3 were given

args
是要传递的参数序列;如果要将
列表
作为唯一的位置参数传递,则需要传递
args=(my_list,)
以使其成为一个包含
列表
(或者大致相当于
args=[my_list]
)的元组


它需要是一系列参数,即使只传递了一个参数,也要避免产生歧义。如果
scr\u runner
接受三个参数,其中两个为默认值,并且
my\u list
的长度为3,您是想将这三个元素作为三个参数传递,还是应该将
my\u list
作为第一个参数,另外两个仍然是默认值?

上传一个带有函数定义的工作代码。@Mehdi Sadeghi:明白了!感谢您查看我的问题。可能有一个解决方案:将
args=my_list
更改为
args=[my_list]
,尽管我认为这种行为有点违反直觉。@Adriankeester:违反直觉?如果
args
未隐式解压为
target
的参数,那么如何将两个或多个参数传递给线程?@ShadowRanger:是的,这是一个很好的观点。谢谢