Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.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
Python:组织这个线程的最佳方式是什么?_Python_Python 3.x_Multithreading - Fatal编程技术网

Python:组织这个线程的最佳方式是什么?

Python:组织这个线程的最佳方式是什么?,python,python-3.x,multithreading,Python,Python 3.x,Multithreading,我想知道在我的代码中组织线程的最佳方式是什么。这是我在线程中调用的函数的一个示例: def func(param1, param2, **kwargs): r = requests.get(param1 + param2) ... do something ... if "queue" in kwargs and isinstance(kwargs["queue"], queue.Queue): kwargs[&qu

我想知道在我的代码中组织线程的最佳方式是什么。这是我在线程中调用的函数的一个示例:

def func(param1, param2, **kwargs):
    r = requests.get(param1 + param2)
    ... do something ...
    if "queue" in kwargs and isinstance(kwargs["queue"], queue.Queue):
        kwargs["queue"].put(r)
    else:
        return r
然后在此处调用此函数:

def thread_func(list_):
    q = queue.Queue()
    for item in list_:
        t = threading.Thread(target = func1, args = (item[0], item[1],), kwargs = {"queue" : q})
        t.start()
    t.join()
    return q
函数func也可以在线程外部(对于单个请求)或线程内部调用,因此我认为如果在线程内部调用队列,并且如果传递了队列,则在kwargs中传递队列,而不是返回结果,将其放入队列中

我还读到我可能会使用一个池来做这件事,但我不知道我需要多少线程

执行速度对我来说很重要,我想知道,您是否认为有办法改进当前代码

例如,我认为最好将func返回的值直接插入到列表中,而不是稍后通过循环队列将其放入列表中,但是我认为队列是存储线程结果的首选对象,因此不确定这是否是一种好的做法


提前感谢

我将使用两个单独的函数,其中包装器使用普通版本。大概是这样的:

def normal_func(param1, param2):
    r = requests.get(param1 + param2)
    ... do something ...
    return r

def thread_func(param1, param2, queue):
    queue.put(normal_func(param1, param2))  # Use the bare-bones version
然后在需要“正常”行为时使用第一个版本,在多线程时使用第二个版本:

t = threading.Thread(target=thread_func, args=(item[0], item[1], q))
试图在一个函数中结合根本不同的行为是混乱的