您的位置:首页 > 编程语言 > Python开发

Python若干小细节的记录(原创)

2010-08-09 10:41 225 查看
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的进程空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: