8.Twisted 多线程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了8.Twisted 多线程相关的知识,希望对你有一定的参考价值。

参考技术A

在 Twisted 中提供的两种线程:

Twisted 中大部分代码都是运行在主线程中,如:dataRecieved、connectionLose 等事件处理函数都是在主线程中被 Twisted 框架调用。这种情况下,如果这些事件处理函数运行的时间较长,则会影响其他事件函数的处理。

在实际开发中,可以将耗时的代码移到辅线程中执行。

在内部,Twisted 很少使用线程。这并不是说它不使用线程。有很多 API 没有等效的非阻塞 API,所以当 Twisted 需要调用它们时,它会在线程中调用它们。

一个常见的错误是认为因为 Twisted 可以同时管理多个连接,所以事情发生在多个线程中,因此您需要小心管理锁。 幸运的是,Twisted 在一个线程中完成了大多数事情!

同时,为了提高运行效率,Twisted 中大多数内置的函数都不是线程安全的,比如:twisted.internet.Protocol().transport.write(),因此需要将内置函数放入主线程中执行,否则可能导致程序逻辑错误,甚至系统崩溃。因此控制代码运行在主线程还是辅线程中是 Twisted 应用开发需要掌握的重要技能。

Twisted 中的所有由框架调用的事件处理函数都运行在主线程中,如果在其他线程中需要执行非线程安全的 Twisted 内置函数,则可以用 reactor.callFromThead() 函数使代码运行在主线程中。

该函数的格式:

该函数将自己的所在的线程在调用处挂起,直到被调用函数在主线程中执行完成。

调用 reactor.callFromThead() 的线程可以是 Twisted 辅线程,也可以是 Twisted 主线程或者是 Python Threading 库等建立的线程。

对于主线程中比较耗时的处理,可以使用 reactor.callInThread() 函数在辅线程中运行。

该函数的格式:

Twisted 使用线程池管理所有的辅线程,可以使用 reactor.suggestThreadPoolsize() 函数定义线程池中的线程数量。该函数格式:

线程数量表示辅线程的最大数量,当线程超过该数量时,这些函数将排队等待前面被调度的函数执行完成后才执行。

在前面的示例中,我们曾经通过 Python Threading 创建了线程来实现定时上报或者定时下发指令等操作,但在子线程操作中,我们没有使用 reactor 的相应函数来让其在主线程中执行,所以,都需要在线程中通过 reactor.callFromThead() 来调用非线程安全函数。

我们以《4.Twisted TCP Socket 编程示例》中的示例2 为例来调整程序,示例2 的内容为:

服务端每隔 10 秒钟随机发送一个指令,客户端根据指令来发送设备使用情况,指令如下:

原示例2 服务端代码:

在上面的代码中,CommandThread 的 run 函数中,下面的代码调用了非线程安全函数,需要做调整。

线程调整如下:

在上面的代码中,我们专门写一个 send 函数来下发指令,在子线程中,通过 reactor.callFromThread() 函数让 send 函数在主线程中执行,因为 send 函数中调用了非线程安全的 Twisted 函数。

iOS详解多线程(实现篇——pThread)

参考技术A 上一节中,我们探究了OC中重要的实现多线程的方法——NSOperation。本节中,我们了解一下不常用的一种创建多线程的方式——pThread。

相关链接:
NSOpreation链接: iOS详解多线程(实现篇——NSOperation)
GCD链接: iOS详解多线程(实现篇——GCD)
NSThread链接: 详解多线程(实现篇——NSThread)
多线程概念篇链接: 详解多线程(概念篇——进程、线程以及多线程原理)

源码链接: https://github.com/weiman152/Multithreading.git

1.NSThread(OC)
2.GCD(C语言)
3.NSOperation(OC)

5.其他实现多线程方法

pThread并不是OC特有的实现多线程的方法,而是Unix、Linux还有Windows都通用的一种实现多线程的方式。
pThread的全称是POSIX threads,是线程的 POSIX 标准。
pThread是C语言的,在iOS的开发中极少使用。

使用之前,记得先导入头文件

运行结果:

从结果可以看出,开启了新的线程,执行任务。

pthread_create() 创建一个线程
pthread_exit() 终止当前线程
pthread_cancel() 中断另外一个线程的运行
pthread_join() 阻塞当前的线程,直到另外一个线程运行结束
pthread_attr_init() 初始化线程的属性
pthread_attr_setdetachstate() 设置脱离状态的属性(决定这个线程在终止时是否可以被结合)
pthread_attr_getdetachstate() 获取脱离状态的属性
pthread_attr_destroy() 删除线程的属性
pthread_kill() 向线程发送一个信号

由于pThread我们基本用不到,所以不再做深入研究。

以上是关于8.Twisted 多线程的主要内容,如果未能解决你的问题,请参考以下文章

并发编程之多线程

什么是多线程,多进程?

多线程和多进程模式有啥区别

多线程Java多线程学习笔记 | 多线程基础知识

java中啥叫做线程?啥叫多线程?多线程的特点是啥

c++ 多线程与c多线程有啥区别?