Skip to content

斗鱼弹幕和多线程的思考

一直以来是个前端Web初级开发。相对偏离“正宗”的编程,像多线程,单线程,协程这些概念实际上是非常模糊的,因为在Web开发里,这些基本都不需要。

Web实际上也是个多线程,只不过貌似 浏览器 的渲染引擎和执行引擎是分开的,总说通过异步来实现类似多线程的功能,但是我一直认知模糊。

这次通过一个小实验,小小的“可能”感受了一下多线程。

实验

通过Python的Websocket库尝试连接斗鱼弹幕服务器,目的是可以剥离开弹幕功能,不用开网页可以看到我最喜欢的总监直播间的弹幕,也方便记录。但由于弹幕是个实时性非常强的功能,有个心跳消息需要固定时间发送给斗鱼服务器确保我们仍然在线。

此时通过单线程貌似是解决不了的,因为我们需要干2件事。

1.接收实时弹幕

2.每隔30秒向服务器发送心跳消息

我尝试暂时不用多线程发现,time.sleep()貌似会阻碍实时弹幕的接收。

python
threading.Thread(target=heartbeat_thread, args=(ws,)).start()  # 启动心跳线程

当启用thread的时候才能两者互不干扰相当于心跳消息在新开的线程上允许。

异步和多线程一样吗?

来自文心一言:

异步和多线程是不同的概念,它们有各自的特点和适用场景。

异步是指一种编程方式,在等待某个事件的过程中,可以继续做其他的事情,而不需要等待这个事件完成后再工作。异步编程可以让程序更高效地利用系统资源,提高程序的响应速度和处理能力。

多线程是程序设计的逻辑层概念,它是进程中并发执行的一段代码。多线程可以实现线程间的切换执行,同时执行多个任务,提高程序的并行处理能力。但是多线程也存在一些问题,如线程安全、线程通信、线程同步等。

异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。在实际应用中,可以根据需要选择适合的并发方式。对于一些需要高并发、高响应速度的场景,可以考虑使用异步编程;而对于需要同时执行多个任务的情况,可以考虑使用多线程编程。

Js这个单线程语言是怎么做的?

实际上,JavaScript并不是通过异步实现多线程的功能,而是使用异步方式处理任务,以实现类似多线程的效果。

在JavaScript中,事件循环(Event Loop)是处理异步任务的机制。当一个异步任务完成时,JavaScript引擎会将对应的回调函数放入事件循环的调用栈中,并在主线程上按照先进先出(FIFO)的顺序执行这些回调函数。同时,JavaScript引擎也会处理如定时器、用户交互等其他异步任务。

通过这种方式,JavaScript可以在单线程环境下模拟出多线程的效果。当一个异步任务需要执行长时间的运算或等待操作时,JavaScript并不会阻塞主线程,而是将该任务放入事件循环中等待处理,而主线程可以继续执行其他任务。这种异步处理的机制可以让JavaScript程序更高效地利用系统资源,提高程序的响应速度和处理能力。

虽然JavaScript使用异步方式实现类似多线程的效果,但实际上它仍然是单线程的。只是通过异步机制,JavaScript可以更高效地处理多个任务,避免了阻塞主线程的问题。

没有事件循环模型,JS无法异步吗?

如果没有事件循环模型,JavaScript将无法实现异步操作。事件循环模型是JavaScript异步处理的核心机制,它负责调度异步任务的执行。

在JavaScript中,异步任务通常包括回调函数、Promise对象、异步函数等。如果没有事件循环模型,这些异步任务将无法被执行,因为JavaScript是单线程的,没有多线程的概念。

事件循环模型在JavaScript中扮演着关键的角色,它使得JavaScript能够在单线程环境下处理多个异步任务,避免了阻塞主线程的问题,提高了程序的响应速度和处理能力。

因此,如果没有事件循环模型,JavaScript就无法实现异步操作。

Python有这个模型吗?

是的,Python具有事件循环模型。Python的异步编程模型基于事件循环,使用协程和异步函数等概念来实现。Python的标准库中有一个名为asyncio的模块,它提供了事件循环的实现以及相关的异步操作。

在Python中,可以使用asyncio模块的事件循环来创建异步任务,并通过asyncio.run()函数来运行这些任务。asyncio模块还提供了许多异步操作,如异步函数、协程、异步生成器等,这些都可以在事件循环中运行。

此外,Python的异步编程模型与其他语言的异步模型类似,如JavaScript的事件循环和Go语言的协程调度器。这些模型都是为了在单线程或多线程环境下更高效地处理并发任务而设计的。

python是假多线程?

Python并不是假多线程,它支持真正的多线程编程。然而,由于Python的全局解释器锁(Global Interpreter Lock,GIL),Python的多线程并不能实现真正的并行计算。

GIL是Python解释器中一个全局的锁,它保证了在同一时间只有一个线程在执行Python字节码。这意味着在多核CPU的情况下,即使在开启了多线程的情况下,Python的多个线程仍然只能在一个核心上交替执行,无法实现真正的并行计算。

因此,在Python中进行并行计算,通常需要使用多进程或者是一些针对特定问题的解决方案,如使用NumPy、Cython等库进行并行计算。但是,对于一些IO密集型任务,Python的多线程仍然可以有效地提高程序的性能。

思考:

其实这个功能若在node里实现,也可以通过一个三十秒的回调实现,也能实现一个类似这样多线程的效果,有时间可以尝试一下。

YisuX.com