Python Threading с последовательными портами, ожидающими завершения другого потока - PullRequest
0 голосов
/ 17 октября 2018

Впервые в очередях и потоках, но так как я заставил свою программу работать и запустить 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
...