我试图在执行线程的python
中复制C#
代码,等待它完成并返回值。本质上,方法RunAndWait
是在一个助手类中,因为对该方法的调用被多次调用。
C#
代码如下:
public static bool RunAndWait(Action _action, long _timeout)
{
Task t = Task.Run(() =>
{
Log.Message(Severity.MESSAGE, "Executing " + _action.Method.Name);
_action();
});
if (!t.Wait(Convert.ToInt32(_timeout)))
{
Log.Message(Severity.ERROR, "Executing " + _action.Method.Name + " timedout. Could not execute MCS command.");
throw new AssertFailedException();
}
t.Dispose();
t = null;
return true;
}
在python
中,我一直在努力解决一些问题。首先,似乎有不同类型的队列,我只是选择了似乎正在工作的import Queue
的导入。其次,我收到一个TypeError,如下所示。
Traceback(最近一次调用):文件"C:/用户/JSC/文件/Git/EnterprisePlatform/企业/AI.App.Tool.AutomatedMachineTest/脚本/monkey.py",第9行文件"C: 用户文档 JSC Git EnterprisePlatform 企业 AI.App.Tool.AutomatedMachineTest Libs MonkeyHelper.py脚本",在RunCmdAndWait中的第4行TypeError: module is not callable
以下是猴子的python
代码:
from Libs.CreateConnection import CreateMcsConnection
import Libs.MonkeyHelper as mh
import Queue
q = Queue.Queue()
to = 5000 #timeout
mh.RunCmdAndWait(CreateMcsConnection, to, q)
serv, con = q.get()
and MonkeyHelper.py
:
import threading
def RunCmdAndWait(CmdToRun, timeout, q):
t = threading(group=None, target=CmdToRun, arg=q)
t.start()
t.join(timeout=timeout)
我不确定我做错了什么。我对python还是个新手。有人能帮我一下吗?
编辑
t = threading.Thread(group=None, target=CmdToRun, args=q)
更正上面的行会出现另一个错误:
线程thread -1异常:回溯(最近一次调用):文件"C:Program Files (x86)IronPython 2.7Libthreading.py",第552行,在_Thread__bootstrap_inner .py中self.run ()文件"C:Program Files (x86)IronPython 2.7Libthreading.py",第505行,在运行中自我。目标(*自我。* * self.__kwargs __args)AttributeError: Queue实例没有属性'__len'
这是因为Thread
期望多个参数还是因为queue
此时仍然为空?从我所看到的是,queue
只是作为一个参数传递来接收返回值。这是正确的方法吗?
Edit2
将t = threading.Thread(group=None, target=CmdToRun, args=q)
更改为t = threading.Thread(group=None, target=CmdToRun, args=(q,))
下面的变化产生TypeError,对我来说似乎很奇怪,因为线程期望一个元组。
线程thread -1异常:回溯(最近一次调用):文件"C:Program Files (x86)IronPython 2.7Libthreading.py",第552行,在_Thread__bootstrap_inner .py中self.run ()文件"C:Program Files (x86)IronPython 2.7Libthreading.py",第505行,在运行中self.__target(*自我。* * self.__kwargs __args)TypeError: tuple is not callable
threading
是一个模块。您的意思可能是替换
t = threading(group=None, target=CmdToRun, arg=q)
t = threading.Thread(group=None, target=CmdToRun, args=(q,))
args
是一个参数元组