Python若干小细节的记录(原创)
1. Queue
Queue实现了一个线程安全的队列。其中get和put是两个最常用的方法。
get和put方法均有两个参数block和timeout。
先说get,当block为True,若timeout为None(默认),则Queue中没有item即阻塞,直到Queue中有item可取;若timeout为一个数,则阻塞timeout时间,若时间到了仍然没有item,就raise exception。当block为false,遇到Queue中没有item,立刻raise exception。
再说put,一样的道理,唯一的区别是Queue(slot)中满了,插不进去会阻塞和抛异常。
2. Thread
join方法,用在thread start之后,表示父线程要等此线程结束才结束。
setDaemon(1),用在thread start之前,表示父线程结束时,此线程立刻结束,不管有没有做完。
另外,不可以直接杀死子线程,如果想实现该类功能,可以用状态量来控制。
Mutex和Binary semaphore的差异:
如下:
(转)
Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个。一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行。
Semaphore是一件可以容纳N人的房间,如果人不满就可以进去,如果人满了,就要等待有人出来。对于N=1的情况,称为binary semaphore。一般的用法是,用于限制对于某一资源的同时访问。
Binary semaphore与Mutex的差异:
在有的系统中Binarysemaphore与Mutex是没有差异的。在有的系统上,主要的差异是mutex一定要由获得锁的进程来释放。而semaphore可以由其它进程释放(这时的semaphore实际就是个原子的变量,大家可以加或减),因此semaphore可以用于进程间同步。Semaphore的同步功能是所有系统都支持的,而Mutex能否由其他进程释放则未定,因此建议mutex只用于保护criticalsection。而semaphore则用于保护某变量,或者同步。
另一个概念是spin lock,这是一个内核态概念。spinlock与semaphore的主要区别是spin lock是busywaiting,而semaphore是sleep。对于可以sleep的进程来说,busywaiting当然没有意义。对于单CPU的系统,busywaiting当然更没意义(没有CPU可以释放锁)。因此,只有多CPU的内核态非进程空间,才会用到spin lock。Linuxkernel的spinlock在非SMP的情况下,只是关irq,没有别的操作,用于确保该段程序的运行不会被打断。其实也就是类似mutex的作用,串行化对critical section的访问。但是mutex不能保护中断的打断,也不能在中断处理程序中被调用。而spinlock也一般没有必要用于可以sleep的进程空间。