导航

      通过os模块中的fork方法,一个进程(Process)可以生成一个独立子进程。fork是一个程序拷贝(copying program)的过程:当程序调用fork方法,操作系统生成一份该程序及其在内存中的进程的新的拷贝,并以与原始程序并行的方式开始执行这份拷贝。原始程序称为父进程,新生成的拷贝叫做子进程。父进程可以生成任意数目的子进程(操作系统不会对此进行控制吗?),子进程还可以生成它的子进程。这些子进程在操作系统的控制下相互独立的并行运行。子进程可以继续运行即便父进程已退出。Python manual中对os.fork的描述是:it generates a copy of the calling program, and returns a different value in each copy: zero in the child process and the process ID of the new child in the parent. 其中对于返回值这部分的描述,我还不是很理解,需要继续找一些资料。os.fork经常和os.exec结合使用使得新生成的进程执行相关操作。

      线程(Threads),又称为“轻量级进程”(lightweight processes),多个线程并行的运行在同一个进程中。线程常用于非阻断的输入调用、运行时间很长的任务等。相比进程,线程具备性能好、简单、共享进程全局内存、兼容性好等优点。但是线程不是一种启动另一个程序的方法,另外由于共享进程的全局内存,多个线程之间存在同步化的问题。

      _thread模块(在Python 2.X中称为thread)中函数start_new_thread(function, args[, kwargs])生成一个新的线程并返回该线程ID,并指定该线程执行相应的函数。当函数返回(返回值被忽略)或函数抛出异常时,线程退出。为了保证线程间的同步化,_thread模块提供了锁(lock)的机制,线程在访问共享资源之前必须获取(acquire)一个锁,在对共享资源完成操作之后,释放(release)该锁,这样其他的线程才能访问共享资源。_thread模块相关的函数是allocate_lock(...)生成一个lock对象, 通过aquire(...)/release(...)方法获取/释放锁。

      如果说_thread模块是一个底层的接口的话,那么threading模块就是一个上层的接口。threading提供了一个Thread类,该类中提供了诸如__init__(self, group=None, target=None, name=None, args=(), kwargs=None, verbose=None),join(self, timeout=None), start(self)等方法。

      Python中queue模块(在Python 2.X中称为Queue)拥有普通list的属性,同时还具备放在queue里的对象受到线程锁获取/释放操作的控制。这样只有一个线程可以修改queue。关于queue模块的详细定义可以参考Python的文档http://docs.python.org/library/queue.html