从另一个模块中的不同线程接收返回值

时间:2016-08-16 08:23:46

标签: python queue ironpython python-multithreading

我正在尝试复制执行线程的C#中的python代码,等待它完成并返回一个值。本质上,方法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中,我一直在努力解决一些问题。首先,似乎有不同类型的Queue,我只选择了似乎正在工作的导入import Queue。其次,我收到如下的TypeError。

  

追踪(最近一次通话):         文件" C:/Users/JSC/Documents/Git/EnterprisePlatform/Enterprise/AI.App.Tool.AutomatedMachineTest/Scripts/monkey.py",   9号线,在         文件" C:\ Users \ JSC \ Documents \ Git \ EnterprisePlatform \ Enterprise \ AI.App.Tool.AutomatedMachineTest \ Scripts \ Libs \ MonkeyHelper.py",   第4行,在RunCmdAndWait中       TypeError:模块不可调用

以下是猴子的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()

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中的异常:   Traceback(最近一次调用最后一次):     文件" C:\ Program Files(x86)\ IronPython 2.7 \ Lib \ threading.py",第552行,在_Thread__bootstrap_inner中       self.run()     文件" C:\ Program Files(x86)\ IronPython 2.7 \ Lib \ threading.py",第505行,运行中       自我。目标(*自我.__ args,**自我.__ kwargs)   AttributeError:队列实例没有属性' __ len '

这是因为Thread期望多个args还是因为此时queue仍为空?从我所看到的是queue只是作为参数传递以接收返回值。这是正确的方法吗?

EDIT2

t = threading.Thread(group=None, target=CmdToRun, args=q)更改为t = threading.Thread(group=None, target=CmdToRun, args=(q,))

下面的TypeError中的变化产生,对我来说似乎很奇怪,因为Thread期待一个元组。

  

线程Thread-1中的异常:   Traceback(最近一次调用最后一次):     文件" C:\ Program Files(x86)\ IronPython 2.7 \ Lib \ threading.py",第552行,在_Thread__bootstrap_inner中       self.run()     文件" C:\ Program Files(x86)\ IronPython 2.7 \ Lib \ threading.py",第505行,运行中       self .__ target(* self .__ args,** self .__ kwargs)   TypeError:元组不可调用

1 个答案:

答案 0 :(得分:1)

threading是一个模块。你可能想要替换

t = threading(group=None, target=CmdToRun, arg=q)

t = threading.Thread(group=None, target=CmdToRun, args=(q,))

args是一个参数元组。