python - 使用threading模块在python中实现线程

标签 python multithreading locking

在 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”的访问是通过合适的锁原子化的。)

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

所以,这是我的问题:

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

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

最佳答案

听起来像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 - 使用threading模块在python中实现线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9597042/

相关文章:

arrays - 防止同步执行完成处理程序

java - 使用 java 调用 Web 服务 URL

Clojure/jetty : Force URL to only be Hit Once at a Time

python - 如何将特定链接存储为列表然后单击它们

python - "Pre-importing"一个变量进入模块

java - ComputeIfAbsent 抛出并发修改异常

java - 重新连接后 Curator 互斥锁失败

c++ - 如何轻松使 std::cout 线程安全?

python - pyautogui typewrite() 写入 shell 而不是单击的输入/文档

python - GAE NDB 访问结构化重复列表中的子实例(字段)