Cách để 2 hàm chạy song song với nhau

Mong mọi người giúp đỡ, mình cần 2 hàm checkRFidTag và KtraCB nó chạy song song với nhau chỉ khi có 1 điều kiện của 1 hàm thỏa thì thực hiện hàm đó và tạm ngắt hàm còn lại sau đó lại tiếp tục kiểm tra 2 hàm có thỏa điều kiện k. Nhưng mà mình code như vầy thì nó lại chỉ kiểm tra đc 1 hàm RFID và không kiểm tra đc hàm còn lại, nó cứ chạy dòng lệnh print(’------------R F I D-------------’) và chờ đến khi thẻ RFID được đặt lên và cứ lặp lại (While True), mong mọi người giúp đỡ mình cách để 2 phần có thể kiểm tra song song

Đây là phần code:

def checkRFidTag():
    if not GPIO.input(11):
        return
    try:
        print('------------R F I D-------------')
        #print("Hold a tag near the reader")
        tagid, text = reader.read()
        print("ID: %s" % (tagid))
        sleep(2)
    except KeyboardInterrupt:
        GPIO.cleanup()
        raise

    if tagid != "":
        RFidRegistered = False
        
        with open("Database.csv") as csvfile:
            csv_reader = csv.DictReader(csvfile)
            for row in csv_reader:
                #print(row['RFid'], row['User'])  
                if str(tagid) == row['RFid']:
                    RFidRegistered = True
                    print("Xe ở vị trí " + row['No']+ " đang xuống........... ")
                    vtt= int(row['No'])
                    xuatoutput(vtt)
                    print("---------------Thông tin---------------")
                    print("Chủ xe: " + row['User'])
                    print("Biển số: " + row['User'])
                    print("Màu xe: " + row['Color'])
        if RFidRegistered == False:
            print("ID không hợp lệ---Vui lòng kiểm tra lại")
############################
def KtraCB():
    global x, enable
    if x == True:
        if not GPIO.input(11):
            sleep(1)
            print('Xe toi vi tri 1')
            x= False
    if x == False:
        if not GPIO.input(13):
            sleep(1)
            print('Chup hinh xe')
            with PiCamera() as camera:
                camera.resolution=(1366,768)
                camera.capture('11.jpg')
                print('Da chup. Cho 3s bat dau xu ly')
                sleep(3)
                enable = True
                x = True
####################
def main():
    while True:
        KtraCB()
        if enable == True:
            break
        checkRFidTag()
######################
if __name__ == "__main__":
    main()

Format lại code đi bạn gì ơi!

2 Likes

Nghe như là đa luồng (multi-threading) ấy nhỉ.:thinking:

5 Likes

@SITUVN.gcd Không nhất thiết phải là đa luồng đâu, đơn luồng cũng làm được, miễn sao là “bất đồng bộ” thì OK thôi.

P/s: Hình như tính năng reply comment có chút lỗi, hay nó là “tính năng” :thinking: ?

4 Likes

Trong lập trình, việc chạy nhiều tác vụ cùng lúc được gọi là bất đồng bộ. Về vấn đề của bạn thì bạn cần phải tìm hiểu về lập trình bất đồng bộ, hay cụ thể hơn là với keyword: Lập trình bất đồng bộ trong Python :wink:

4 Likes

Cho mình mở mang tầm mắt execute 2 tasks parallel mà ko dùng multithread với, mình cũng ko biết làm sao.
Còn bản thân asynchronize thì qua working experience của mình luôn phải dùng multithread, vì trên cùng 1 thread ko cách nào cho 2 task chạy cùng cùng lúc được.

5 Likes

https://docs.python.org/3/library/asyncio.html

4 Likes

Đọc cài này đi anh Born, nhưng k phải bên python th. :kissing:

1 Like

Ở application level thì có thể implement 1 event loop thì vẫn có thể chạy đồng thời các task dù chỉ có 1 thread nhưng nếu các task là Blocking operation thì k thể chạy đồng thời được nữa. Giả sử các task là non blocking để lấy kết quả sẽ thông qua callback, Promise, Future…

1 Like

Theo mình thấy bạn gặp vấn đề trên do reader.read() là 1 hàm blocking.
Hướng giải quyết có 2 cách:

  • Code lại reader.read() thành non-blocking function. Nếu bạn đang dùng thư viện nào đó thì kiểm tra xem có hàm khác có chức năng check thay vì read không?
  • Dùng multi-thread như các bạn khác khuyên.
4 Likes

Thanks các bạn nhưng có vẻ mọi người hiểu sai ý mình rồi.
Tất nhiên mình biết những khái niẹm trẻn vì mình đã làm việc với chúng khá nhiều, nhưng các bạn phải hiểu là event loop, vẫn ko thực sự start 2 tasks CÙNG LÚC, nó vẫn theo thứ tự nên ko thể gọi là parallel được.
Cái này là kiến thức basic, thậm chí bạn ko cần đọc những article trên vẫn có thể suy ra được. Vì nguyên tắc OS làm việc phân task theo các thread, mỗi thread được chỉ định thực hiện một số tasks tùy theo resource status hiện tại của system.
Một thread KHÔNG thể execute nhiều task CÙNG LÚC, mà phải execute vào những thời điểm khác và việc có đợi task này finished rồi mới đến task khác start hay ko thì nó mới phân ra là async/sync hay ko.
Chính xác thì 1 thread execute nhiều tasks vào những thời điểm KHÁC NHAU gọi là concurrent.

6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?