如何在共享值的同时运行两个线程?

时间:2018-08-04 11:43:23

标签: python multithreading queue

我需要运行两个线程。第一个是传感器,第二个是电动机。 我需要以两个不同的延迟时间并行运行这两个线程,并且需要在它们之间进行通信。这是我的尝试代码。在这里,马达线仅运行一次并打印

这是代码

from queue import Queue
from threading import Thread
import time

def sensor(numbers,q):
    for n in numbers:
        q.put(n*n)
        print (n*n)
        time.sleep(1)  # Add some delay here

def motor():
    a=q.get()
    if (a<10):
        print("good")
        time.sleep(2)  # Add some delay here
    else:
        print ("bad")
        time.sleep(2)  # Add some delay here


if __name__=="__main__":
    numbers = [1,2,3,4,5,6,7,8]
    q= Queue()

    p= Thread(target=sensor , args = (numbers,q))
    r= Thread(target = motor)
    p.start()
    r.start() 

` 这是我得到的结果

1
good
4
9
16
25
36
49
64

每个数字后我都需要发表好或不好的评论。

2 个答案:

答案 0 :(得分:1)

这就是我要做的。首先,motor任务应该是一个循环,以便它在运行时从Queue中检索多个项目。为了告诉它何时停止,可以在队列中放入一个特殊值(标记)以指示要执行的任务(退出循环并退出)。

完成此操作后,您可以通过调用其join()方法来等到它完成。

这是我的意思:

from queue import Queue
from threading import Thread
import time

def sensor(numbers, q):
    for n in numbers:
        q.put(n*n)
        print(n*n)
        time.sleep(1)  # Add some delay here

    q.put(None)  # End marker.

def motor():
    while True:
        a = q.get()
        if a is None:  # End marker?
            break  # Quit.
        if a < 10:
            print("good")
            time.sleep(2)  # Add some delay here
        else:
            print ("bad")
            time.sleep(2)  # Add some delay here


if __name__=="__main__":
    numbers = [1,2,3,4,5,6,7,8]
    q = Queue()

    p = Thread(target=sensor, args=(numbers, q))
    r = Thread(target=motor)
    p.start()
    r.start()
    r.join()  # Wait for consumer thread to finish.
    print('done')

答案 1 :(得分:0)

函数motor调用方法q.get(),该方法仅从队列中返回一项,因此正常情况下它仅输出一项结果。

您必须遍历队列直到队列为空

def motor():
    while not q.empty():
        a=q.get()
        if (a<10):
            print("good")
            ...