通常,程序在文件中最后一行代码执行后终止(或调用sys.exit())。
在程序的所有线程终止之前,python程序不会终止。
多线程也可能会导致所谓的并发问题。如果这些线程同时读写变量,导致互相干扰,就会发生并发问题。
为了避免并发问题,绝不让多个线程读取或写入相同的变量。
当创建一个新的Thread对象时,要确保其目标函数只使用该函数中的局部变量。
1
2
3
4
|
>>>
import
threading
>>> threadObj
=
threading.Thread(target
=
print
,args
=
[
'a'
,
'b'
,
'c'
],kwargs
=
{
'sep'
:
' & '
})
>>> threadObj.start()
a & b & c
|
利用内建的subprocess模块中的Popen()函数,python程序可以启动计算机中的其他程序。
如果打开一个应用程序的多个实例,每个实例都是同一个程序的不同进程。
每个进程可以有多个线程。不像线程,进程无法直接读写另一个进程的变量。
返回值是一个Popen对象,它有两种可用的方法:poll()和wait()。
如果这个进程在poll()调用时仍在运行,poll()方法就返回None。如果该程序已经终止,它会返回该进程的整数退出代码。退出代码用于说明进程是无错终止(退出代码为0),还是一个错误导致进程终止。
wait()方法将阻塞,直到启动的进程终止。它的返回值是进程的整数退出代码。
可以向Popen()传递一个列表,作为唯一的参数。该列表中的第一个字符串是要启动的程序的可执行文件名,所有后续的字符串将是该程序启动时,传递给该程序的命令行参数。实际上,这个列表将作为被启动程序的sys.argv的值。
1
2
3
4
|
>>>
import
subprocess
>>> subprocess.Popen(
'/usr/bin/pwd'
)
/
root
<subprocess.Popen
object
at
0x7f9e39d23438
>
|
计划任务:Task Scheduler(windows)、launchd(OS X)、cron(linux)
webbrowser.open()函数可以从程序启动web游览器,打开指定的网站。
可以在python中启动另一个python脚本,就像任何其他的应用程序一样。只需要向Popen()传入python.exe可执行文件,并将想运行的.py脚本的文件名作为它的参数。
不同于将python程序导入为一个模块,如果python程序启动了另一个python程序,两者将在独立的进程运行,不能分享彼此的变量。
每个操作系统都有一个程序,其行为等价于双击文档文件来打开它。在windows上,这是start程序。在OS X上,这是open程序。在ubuntu linux上,这是see程序。
1
2
|
>>>
import
subprocess
>>> subprocess.Popen([
'start'
,
'hello.txt'
],shell
=
True
)
|
Unix哲学:编写小的、目的有限的、能互操作的程序,胜过大的、功能丰富的应用程序。