Python 多线程 类 return 值
Python multithreading with Classes that return values
所以我知道 Python 中的基本线程是如何工作的,但这是我的问题:
- 我有两个自定义 python 模块,每个 return 一个值(一个 return 是字典,另一个是日期时间对象)
- 我正在将它们导入到第三个 py 脚本文件(使用导入函数),该文件使用这些 returned 值
- 两个模块互不依赖
- return字典中的一个花费的时间是另一个的两倍(这就是出现此问题的原因)。
- 两个自定义模块都绑定在 Class 和
__init__
内,所以它是这样的:
Class A:
def __init__(self, var1, var2):
// the regular self.var assignments
def Aa(self):
// process the input values
return dict_value
和
Class B:
def __init__(self, var3):
// the regular self.var assignments
def Bb(self):
// process the input values
return datetime_object
我为什么要写这些?继续阅读:
当然,因为一个功能比另一个功能花费的时间更长,我想优化程序。我正在尝试实现线程,但由于我的模块是从外部导入的,加上它们 return 值的事实,我发现它有点挑战。我最接近的是这个答案: - 基本上是这部分:
from threading import Thread
from Queue import Queue
def func1(x):
return [i*i for i in x]
def func2(x):
return [i*i*i for i in x]
nums = [1,2,3,4,5]
def wrapper(func, arg, queue):
queue.put(func(arg))
q1, q2 = Queue(), Queue()
Thread(target=wrapper, args=(func1, nums, q1)).start()
Thread(target=wrapper, args=(func2, nums, q2)).start()
print q1.get(), q2.get()
没问题,但我不知道如何在包装函数中传递参数。因为我在 class 中使用了 init,所以我在 class 本身中传递参数,然后调用其中的定义。我似乎不知道该怎么做。
例如,这是我正在做的,但它不起作用(很明显):
Thread(target=wrapper, args=(A(var1, var2).Aa, q1)).start()
错误显示为“TypeError:wrapper() 缺少 1 个必需的位置参数:'queue'”
即使我很早就声明了参数(比如 nums
是如何声明的),args
如何知道将值传递到哪里?我没听懂。
提前致谢。
看起来您需要一个不同的 wrapper
函数来调用方法 Aa
和 Bb
,因为它们没有这样的参数:
def wrapper(func, queue):
queue.put(func())
q1, q2 = Queue(), Queue()
Thread(target=wrapper, args=(A(var1, var2).Aa, q1)).start()
Thread(target=wrapper, args=(B(var3).Bb, q2)).start()
print q1.get(), q2.get()
所以我知道 Python 中的基本线程是如何工作的,但这是我的问题:
- 我有两个自定义 python 模块,每个 return 一个值(一个 return 是字典,另一个是日期时间对象)
- 我正在将它们导入到第三个 py 脚本文件(使用导入函数),该文件使用这些 returned 值
- 两个模块互不依赖
- return字典中的一个花费的时间是另一个的两倍(这就是出现此问题的原因)。
- 两个自定义模块都绑定在 Class 和
__init__
内,所以它是这样的:
Class A:
def __init__(self, var1, var2):
// the regular self.var assignments
def Aa(self):
// process the input values
return dict_value
和
Class B:
def __init__(self, var3):
// the regular self.var assignments
def Bb(self):
// process the input values
return datetime_object
我为什么要写这些?继续阅读:
当然,因为一个功能比另一个功能花费的时间更长,我想优化程序。我正在尝试实现线程,但由于我的模块是从外部导入的,加上它们 return 值的事实,我发现它有点挑战。我最接近的是这个答案: - 基本上是这部分:
from threading import Thread
from Queue import Queue
def func1(x):
return [i*i for i in x]
def func2(x):
return [i*i*i for i in x]
nums = [1,2,3,4,5]
def wrapper(func, arg, queue):
queue.put(func(arg))
q1, q2 = Queue(), Queue()
Thread(target=wrapper, args=(func1, nums, q1)).start()
Thread(target=wrapper, args=(func2, nums, q2)).start()
print q1.get(), q2.get()
没问题,但我不知道如何在包装函数中传递参数。因为我在 class 中使用了 init,所以我在 class 本身中传递参数,然后调用其中的定义。我似乎不知道该怎么做。
例如,这是我正在做的,但它不起作用(很明显):
Thread(target=wrapper, args=(A(var1, var2).Aa, q1)).start()
错误显示为“TypeError:wrapper() 缺少 1 个必需的位置参数:'queue'”
即使我很早就声明了参数(比如 nums
是如何声明的),args
如何知道将值传递到哪里?我没听懂。
提前致谢。
看起来您需要一个不同的 wrapper
函数来调用方法 Aa
和 Bb
,因为它们没有这样的参数:
def wrapper(func, queue):
queue.put(func())
q1, q2 = Queue(), Queue()
Thread(target=wrapper, args=(A(var1, var2).Aa, q1)).start()
Thread(target=wrapper, args=(B(var3).Bb, q2)).start()
print q1.get(), q2.get()