簡體   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