繁体   English   中英

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

[英]Implementing threads in python with threading module

在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安全的方法。 (当一个线程重新锁定时,没有保证另一个线程将在同一线程再次获取之前获取它)

听起来像Queue模块就是您所需要的。

这将为您提供阻塞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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM