返回

协作乐章:1115交替打印 FooBar

后端

引言

多线程是计算机科学中一种重要的概念,它允许在一个程序中同时执行多个任务。多线程程序可以提高程序的性能,因为多个任务可以同时运行,从而减少了等待时间。

在多线程程序中,经常会遇到需要多个线程交替执行的情况。例如,在一个聊天程序中,多个用户可以同时发送消息,需要程序能够交替打印这些消息。

问题

LeetCode 1115 题要求我们编写一个多线程程序,该程序包含两个线程,一个线程打印 "Foo",另一个线程打印 "Bar"。两个线程交替打印,直到打印出 "FooBar" 10 次。

解决方案

使用锁和条件变量

我们可以使用 Python 的多线程模块和锁来实现交替打印 FooBar 问题。首先,我们需要创建一个锁,用于控制对共享数据的访问。然后,我们需要创建两个条件变量,分别用于等待 "Foo" 线程和 "Bar" 线程。

import threading
import time

# 创建锁和条件变量
lock = threading.Lock()
cond_foo = threading.Condition(lock)
cond_bar = threading.Condition(lock)

# 创建两个线程
def foo():
    for i in range(10):
        # 等待锁释放
        with cond_foo:
            cond_foo.wait()

        # 打印 "Foo"
        print("Foo")

        # 释放锁并通知 "Bar" 线程
        cond_bar.notify()

def bar():
    for i in range(10):
        # 等待锁释放
        with cond_bar:
            cond_bar.wait()

        # 打印 "Bar"
        print("Bar")

        # 释放锁并通知 "Foo" 线程
        cond_foo.notify()

# 启动两个线程
t1 = threading.Thread(target=foo)
t2 = threading.Thread(target=bar)
t1.start()
t2.start()

# 等待两个线程结束
t1.join()
t2.join()

使用队列

我们还可以使用 Python 的队列模块来实现交替打印 FooBar 问题。首先,我们需要创建一个队列,用于存储 "Foo" 和 "Bar"。然后,我们需要创建两个线程,一个线程从队列中取出 "Foo" 并打印,另一个线程从队列中取出 "Bar" 并打印。

import threading
import queue

# 创建队列
q = queue.Queue()

# 创建两个线程
def foo():
    for i in range(10):
        # 从队列中取出 "Foo" 并打印
        q.get()
        print("Foo")

        # 将 "Bar" 放入队列
        q.put("Bar")

def bar():
    for i in range(10):
        # 从队列中取出 "Bar" 并打印
        q.get()
        print("Bar")

        # 将 "Foo" 放入队列
        q.put("Foo")

# 启动两个线程
t1 = threading.Thread(target=foo)
t2 = threading.Thread(target=bar)
t1.start()
t2.start()

# 等待两个线程结束
t1.join()
t2.join()

运行结果

FooBarFooBarFooBarFooBarFooBarFooBarFooBarFooBarFooBarFooBar

总结

在这篇文章中,我们介绍了如何使用 Python 多线程和锁或队列来实现交替打印 FooBar 问题。我们还提供了代码示例,展示了如何编写和运行此程序。希望这篇文章对您有所帮助。