我现在正在制作一个程序,要求用户输入矩阵的行列式。 首先,将生成一个非常复杂的矩阵,两秒钟后,将生成一个新的矩阵。
这是我的代码
#import part
import numpy
import scipy
import threading
from multiprocessing import pool
#defining part
def random_matrix(n):
array = numpy.random.random((n,n))
print array
def random_matrix_integer(n):
print "Sorry I was just joking, Please calculate this one."
array = numpy.random.random_integers(0,10,(n,n))
print array
#process part
print "Now,let's start a mathematical game."
random_matrix(3)
print "Please Tell me the dot product of this Matrix\n"
t =threading.Timer(2,random_matrix_integer(3))
t.start()
直到计时器部分才能工作 “请告诉我这个矩阵的点积”将同时用第一个矩阵警告, 两秒钟后控制台说
Exception in thread Thread-1:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 1082, in run
self.function(*self.args, **self.kwargs)
TypeError: 'NoneType' object is not callable
如果有人可以帮我解决这个简单的问题,我会非常感激
答案 0 :(得分:1)
您需要传递一个可调用对象,因此请使用lambda
:
t =threading.Timer(2,lambda: random_matrix_integer(3))
或者使用args传递random_matrix_integer
来传递n
:
t = threading.Timer(2,random_matrix_integer, args=(3,))
答案 1 :(得分:0)
<强>更新:强>
任何multiprocessing
方法的返回值都是None
。
所以你可以做到以下几点:
#defining part
def random_matrix(n):
array = numpy.random.random((n,n))
print array
def random_matrix_integer(n):
output = numpy.random.random_integers(0,10,(n,n))
print output
def next(n):
print "Sorry, I was just joking, let's calculate the result of this one."
random_matrix_integer(n)
#process part
print "Now,let's start a mathematical game."
random_matrix(3)
print "Please Tell me the dot product of this Matrix\n"
t =threading.Timer(2,next,args=(3,))
t.start()
<强>输出:强>
Now,let's start a mathematical game.
[[ 0.00496393 0.64893226 0.72005749]
[ 0.75589265 0.2527754 0.61459672]
[ 0.89208782 0.54560049 0.57733855]]
Please Tell me the dot product of this Matrix
Sorry, I was just joking, let's calculate the result of this one.
[[10 2 5]
[ 9 1 0]
[ 4 6 6]]
或者,如果您打算稍后共享或处理返回变量,您可以创建并使用multiprocessing.Array
或multiprocessing.Manager
变量来存储您已获得的值,这样您就可以操作这样的变量多处理后的“返回”值。
答案 2 :(得分:0)
您需要将函数传递给Timer,而不是将调用的结果传递给函数。
import threading
def foo():
print "foo"
t =threading.Timer(2, foo)
t.start()
请注意缺少括号 - 这意味着您传递了foo
,而不是foo()
的结果