Ich versuche, C#
Code in python
zu replizieren, die einen Thread ausführt, wartet, bis es fertig ist und einen Wert zurückgibt. Im Wesentlichen befindet sich die Methode RunAndWait
in einer Hilfsklasse, da ein Aufruf dieser Methode mehrmals erfolgt.Empfangen Rückgabewert von anderen Thread in einem anderen Modul
C#
Code ist wie folgt:
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;
}
In python
ich mit ein paar Dinge zu kämpfen haben. Erstens scheint es verschiedene Arten von Queues zu geben, wo ich einfach den Import ausgewählt habe, der zu funktionieren schien import Queue
. Zweitens erhalte ich einen TypeError wie unten.
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
Hier ist der Code für python
Affe:
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()
und MonkeyHelper.py
:
import threading
def RunCmdAndWait(CmdToRun, timeout, q):
t = threading(group=None, target=CmdToRun, arg=q)
t.start()
t.join(timeout=timeout)
Ich bin nicht sicher, was ich falsch mache. Ich bin ziemlich neu bei Python. Könnte mir bitte jemand helfen?
bearbeiten
t = threading.Thread(group=None, target=CmdToRun, args=q)
einen weiteren Fehler der Linie oben gebracht Korrektur:
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'
Ist das, weil Thread
erwartet mehrere args oder weil die queue
ist an dieser Stelle noch leer? Von dem, was ich gesehen habe, ist, dass die queue
gerade als Argument übergeben wird, um den Rückgabewert zu erhalten. Ist das der richtige Weg?
EDIT2
Changed t = threading.Thread(group=None, target=CmdToRun, args=q)
-t = threading.Thread(group=None, target=CmdToRun, args=(q,))
Die Veränderung Erträge in einem Typeerror unten, scheint mir seltsam, da Thread ist ein Tupel erwartet.
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
Sie möchten 'threading.Thread()'. Wenn Sie den Fehler genau betrachten, wird es Sinn machen. – sberry