【问题标题】:Implementing threads in python with threading module使用线程模块在python中实现线程
【发布时间】:2012-03-07 06:55:28
【问题描述】:

在 python 程序中,我需要 2 个基于 Threading 模块的线程。线程#1 生成一些数据并将其放入缓冲区中,线程#2 应该处理缓冲区中的数据。

所以我的伪代码是这样的: 线程 1:

Thread#1
while True:
   Generate_Some_Data()
   while flag==1:
      pass()
   Buffer_Address=Write_It_To_Buffer()
   flag=1


Thread#2
while True:
   while flag==0:
      pass()
   Process_Data(Buffer_Address)
   flag=0

(让我们假设对变量“flag”的访问是用合适的锁原子化的。)

我知道线程模块不是并发的。本质上,这意味着除非其中一个线程在某些外部条件(例如 file-io 或 time.sleep)上没有阻塞,否则两个线程将共享总处理时间,而不管任务如何。因此,据我了解,在上述配置中,大约一半的总处理时间将浪费在“while flag”循环上。

所以,这是我的问题:

  1. 我对线程模块的上述预期/理解是否正确?总进程时间的一半是否浪费在“while flag”循环中?

  2. (如果我是对的)有没有办法完全摆脱“while 标志”循环?我试图找出另一种结构,在这种结构中我可以让线程在 lock.acquire() 方法中休眠,但是,我想不出一个 %100 安全的方法。 (当一个线程释放锁时,不保证另一个线程会在同一个线程再次获取它之前获取它)

【问题讨论】:

    标签: python multithreading locking


    【解决方案1】:

    听起来the Queue module 是您所需要的。

    这将为您提供一个阻塞的 FIFO 队列。每当消费者线程从队列中获取一些东西时,如果那里没有任何东西,它将阻塞直到有东西可用,从而给生产者线程时间来生产一些东西。

    如果您担心生产者线程占用所有计算周期,您可以限制队列的大小。如果队列满了,而生产者线程有东西要添加,它就会阻塞,直到消费者线程取出东西。

    这是一些伪代码:

    import Queue
    q = Queue.Queue()
    
    # Producer thread
    while True:
        data = generate_some_data()
        q.put(data)
    
    # Consumer thread
    while True:
        data = q.get()
        process_data(data)
    

    【讨论】:

    • 我还有一个后续问题。 python 队列是信号量概念的实现,它假设消费者线程是相同的。假设我有 2 个消费者线程,它们应该根据数据类型处理队列中的数据。例如,假设如果数据是“int”类型,那么消费者 1 必须处理它。如果它是“浮动的”,那么消费者 2 必须处理它。但是,如果它是“字符串”,那么消费者 1 和 2 都不应处理数据。是否有任何编程范式可用于实现此类问题?
    • @user460153 我会为每个消费者创建一个单独的队列。
    • 我认为“条件变量”是解决这个问题的更好范例。所有消费者线程等待主线程发出信号。在主线程发出信号后,每个消费者线程都会检查数据类型并决定是处理数据还是继续休眠。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    相关资源
    最近更新 更多