文章目录
一、线程
线程:程序单一执行点的控制流,是进程的一部分,每个进程含有至少一个线程。
多线程程序模型:
二、Perl多线程与胶水语言
(一)Perl中的线程
Perl 中的数据默认不能在线程中被分享,因 此Perl模块有很好的线程安全性或者很容易被做成线程安全的。
可使用threads::shared包来实现数据共享。
但并非所有的模块都是线程安全的,因此应该假设模块是不安全的,除非文档说明了, 否则应该进行代码测试。
1.如何获取所使用的的perl版本支持的线程模型?
方法一:从shell直接查看
perl -v | grep use.*threads
(二)Perl中多线程的实现
线程的生命周期:创建、运行、退出
1.创建线程
threads模块提供了创建线程的工具,create/async
。
#!/usr/bin/perl
use threads;
my $Param3='foo';
my $thr1=threads->create(\&sub1,'Param 1','Param 2',$Param3);
my @ParamList=(42,'Hello',3.14);
my $thr2=threads->create(\&sub1,@ParamList);
my $thr3=threads->create(\&sub1,qw(Param1 Param2 Param3));
sub sub1{
my @In=@_;
print("In the thread\n");
print('Got parameters >',join('<>',@In),"<\n");
}
2.回收
线程为子程序,可以返回值,使用join
回收;若没有返回值则用detach
回收
3.线程终止
die
,exit
要等所有线程执行完毕后,除非是需要提前结束;
所有能够结束进程的方法都可以结束所有运行的线程。
4.同步和控制
通过
lock
函数对分享的变量加锁(也可以在数组或哈希表上使用锁机制),当一个线程锁定了变量,其它线程不可以锁定该变量,直到该线程解锁该变量。锁机制不是锁住对数据的访问而是锁住访问的企图!
当锁定的线程运行离开包含lock的语句块时自动解锁。
锁是递归的(recursive),一个线程可以多次锁定一个变量,锁将持续到最外层的锁的作用域。
死锁:假如一个线程对某一个共享变量实施了锁操作,在它没有释放锁之 前,如果另外一个线程也对这个共享变量实施锁操作,那么这个线程就会被阻塞,阻塞不会被自动中止而是直到前一个线程将锁释放为止,这样的模式就是死锁。
5.线程实用技巧
5.1队列:一种线程安全的对象,用于将数据从一端放进去,从另一端取出来,不用担心数据同步问题。
5.2信号:
5.2.1信号基本应用
5.2.2
(三)Perl胶水语言
1.Perl与Unix
system
与exec
2.Perl与Wins
反引号``
3.Perl与C
4.Perl与Java
5.Perl与R
6.Perl与Python
三、Python多线程与胶水语言
(一)Python中的线程
Python中常用线程模块: _thread、threading(推荐使用)
Python中使用线程有两种方式:函数或者用类来包装线程对象。
1.函数式
调用 _thread
模块中的start_new_thread()
函数来产生新线程。
2.继承创建一个新的子类
直接从 threading.Thread
继承创建一个新的子类,并实例化后调用 start()
方法启动新线程。
(二)线程同步
当线程需要共享数据时,可能存在数据不同步的问题。
为了避免这种情况,引入了锁的概念,锁有两种状态——锁定和未锁定。
1.锁
使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步。
这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到
acquire
和release
方法之间。
2.线程优先级队列
Python 的 Queue
模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列 PriorityQueue。