Я пытаюсь реплицировать код 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, как показано ниже.
Traceback (most recent call last): File "C:/Users/JSC/Documents/Git/EnterprisePlatform/Enterprise/AI.App.Tool.AutomatedMachineTest/Scripts/monkey.py", line 9, in File "C:\Users\JSC\Documents\Git\EnterprisePlatform\Enterprise\AI.App.Tool.AutomatedMachineTest\Scripts\Libs\MonkeyHelper.py", line 4, in RunCmdAndWait 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()
и 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)
корректирующая выше линии принес еще одну ошибку:
Exception in thread Thread-1: Traceback (most recent call last): File "C:\Program Files (x86)\IronPython 2.7\Lib\threading.py", line 552, in _Thread__bootstrap_inner self.run() File "C:\Program Files (x86)\IronPython 2.7\Lib\threading.py", line 505, in run self.target(*self.__args, **self.__kwargs) AttributeError: Queue instance has no attribute '__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 ожидает кортеж.
Exception in thread Thread-1: Traceback (most recent call last): File "C:\Program Files (x86)\IronPython 2.7\Lib\threading.py", line 552, in _Thread__bootstrap_inner self.run() File "C:\Program Files (x86)\IronPython 2.7\Lib\threading.py", line 505, in run self.__target(*self.__args, **self.__kwargs) TypeError: tuple is not callable
Вы хотите 'threading.Thread()'. Если вы посмотрите на ошибку, это будет иметь смысл. – sberry