现有A、B两个线程,文件夹S中有10张图片,图片名分别为a1.jpg或a1.png、b2.jpg或b2.png、c3..d4..以此类推..k10.jpg或k10.png,A线程任务是往文件夹D中拷贝图片,B线程任务是每有一张图片拷贝进来,需将图片名称改成1.jpg或1.png。。以此类推到10.png或10.jpg,然后程序退出。要求:A线程不能一次拷贝多张图片,B线程不能一次修改多张图片名,即模拟生产者、消费者,拷贝进一个,修改一个名称
时间: 2024-02-20 09:59:18 浏览: 107
Parallel.ForEach的卡死现象(线程操作问题C#源码实例)
这是一个典型的生产者消费者模型的应用。下面是一个简单的实现:
```python
import Queue
import threading
import os
def producer(queue, source_folder):
"""生产者线程,从源文件夹中读取图片,加入队列"""
for i in range(1, 11):
filename = os.path.join(source_folder, "a%d.jpg" % i)
if not os.path.exists(filename):
filename = os.path.join(source_folder, "a%d.png" % i)
if not os.path.exists(filename):
continue
queue.put(filename)
def consumer(queue, dest_folder):
"""消费者线程,从队列中读取图片,修改文件名并拷贝到目标文件夹"""
i = 1
while True:
filename = queue.get()
new_filename = os.path.join(dest_folder, "%d" % i)
if filename.endswith(".jpg"):
new_filename += ".jpg"
elif filename.endswith(".png"):
new_filename += ".png"
else:
continue
os.rename(filename, new_filename)
i += 1
if i > 10:
break
def main():
queue = Queue.Queue()
source_folder = "S"
dest_folder = "D"
t1 = threading.Thread(target=producer, args=(queue, source_folder))
t2 = threading.Thread(target=consumer, args=(queue, dest_folder))
t1.start()
t2.start()
t1.join()
t2.join()
if __name__ == '__main__':
main()
```
这个程序创建了一个队列,一个生产者线程和一个消费者线程。生产者线程从源文件夹中读取图片,如果找到了就加入队列。消费者线程从队列中读取图片,修改文件名并拷贝到目标文件夹。每拷贝一张图片,就把它的编号加一。当编号到达10时,程序退出。
这个程序满足题目要求,即生产者不能一次拷贝多张图片,消费者不能一次修改多张图片名。生产者和消费者使用了同一个队列,实现了线程间的同步。
阅读全文