Впервые в очередях и потоках, но так как я заставил свою программу работать и запустить 2 потока моторов отдельно друг от друга, я заметил, что еще есть момент, когда один из них будет ждать завершения другого.
У меня 2 мотора на линейных рельсах.Чтобы проверить их последовательность, повторяемость и точность, он запускает домашний тест.Просто предоставив двигателю фиксированное количество тестов и позицию, по которой он будет двигаться, туда и обратно, он записывает данные и сообщает мне, как близко мы подошли как по шагам, так и по расстоянию.Странное поведение заключается в том, что один двигатель ждет, пока другой завершит свой цикл, прежде чем начинать следующий цикл.
Я предполагаю, что это проблема с последовательным чтением, когда мой двигатель задерживается в ожидании последовательного чтения на одном двигателе и не может выполнить другой.Кто-нибудь может подтвердить это или обойти?
Код для теста, завернутый в класс
def home(self):
DIConf = None
debugStart = time.time()
while DIConf != -1:
self.anyCMD('DI-1')
while DIConf == None:
DIConf = self.checkReturn('DI')
if time.time() - debugStart >= 5:
print 'DIConf = ' + str(DIConf)
return 'Homing Timeout'
self.s.write('SH1H\r')
def homeTest(self, numTests = 30, testPos = 100000):
if numTests == None:
numTests = 30
if testPos == None:
testPos = 100000
self.tests = numTests
self.testingPos = testPos
self.B = np.zeros((tests, 4))
for i in range(0, self.tests):
# print i
self.setPos(0)
self.start = time.time()
self.gotoPos(self.testingPos)
self.s.write('WM\r')
time.sleep(2)
while self.getPos() < self.testingPos:
pass
self.testPosConfirm = self.getPos()
self.home()#(setHomePos = 1)
self.s.write('WM\r')
time.sleep(2)
self.end = time.time()
self.backHome = self.getPos()
self.B[i][0] = self.testPosConfirm
self.B[i][1] = self.backHome
self.B[i][2] = (float(self.backHome)/20000) * 3.175
self.B[i][3] = self.end-self.start
return self.B
и код для очереди / потоков
import Queue
import threading
a = Queue.Queue()
b = Queue.Queue()
y = motor(DA = 1)
z = motor(DA = 2)
def yQueue(tempY, tempA, cycles = None, defPos = None):
tempVar = tempY.homeTest(cycles, defPos)
tempA.put(tempVar)
if 1 == 1:
thread = threading.Thread(target = yQueue, args = [y, a, 5, 50000])
thread2 = threading.Thread(target = yQueue, args = [z, b, 5, 600000])
thread.start()
thread2.start()
Как предлагается ниже.Попытка сделать то же самое с Multiprocessing и получить аналогичные результаты.
Код:
import multiprocessing as mp
p = mp.Process(target = yQueue, args = [y, a, 3, 40000])
p.start()
p.join
p2 = Process(target = yQueue, args = [z, b, 3, 500000])
p2.start()
p2.join