有两种方式来实现并发性,一种方式是让每一个“任务"或“进程”在单独的内在空间中工做,每一个都有自已的工做内存区域。不过,虽然进程可在单独的内存空间中执行,但除非这些进程在单独的处理器上执行,不然,实际并非“同时”运行的。是由操做系统把处理器的时间片分配给一个进程,用完时间片后就需退出处理器等待另外一个时间片的到来。另外一种方式是在在程序中指定多个“执行线程”,让它们在相同的内存空间中工做。这称为“多线程处理”。线程比进程更有效,由于操做系统没必要为每一个线程建立单独的内存空间。python
新建进程用os.fork函数。但它只在POSIX系统上可用,在windows版的python中,os模块没有定义os.fork函数。相反,windows程序员用多线程编程技术来完成并发任务。linux
os.fork函数建立进程的过程是这样的。程序每次执行时,操做系统都会建立一个新进程来运行程序指令。进程还可调用os.fork,要求操做系统新建一个进程。父进程是调用os.fork函数的进程。父进程所建立的进程叫子进程。每一个进程都有一个不重复的进程ID号。或称pid,它对进程进行标识。子进程与父进程彻底相同,子进程从父进程继承了多个值的拷贝,如全局变量和环境变量。两个进程的惟一区别是fork的返回值。子进程接收返回值0,而父进程接收子进程的pid做为返回值。程序员
用os.fork建立的子进程和父进程做为异步的并发进程而单独执行。异步是指它们各行其是,相互间不进行同步;并发是指它们可同时执行。因此咱们没法知道子进程和父进程的相对速度。shell
os.wait函数用于等待子进程结束(只适用于UNIX兼容系统)。该函数返回包含两个元素的元组,包括已完成的子进程号pid,以及子进程的退出状态,返回状态为0,代表子进程成功完成。返回状态为正整数代表子进程终止时出错。如没有子进程,会引起OSError错误。os.wait要求父进程等待它的任何一个子进程结束执行,而后唤醒父进程。编程
要指示父进程等候一个指定的子进程终止,可在父进程中使用os.waitpid函数(只适用于unix兼容系统)。它可等候一个指定进程结束,而后返回一个双元素元组,其中包括子进程的pid和子进程的退出状态。函数调用将pid做为第一个参数传递,并将一个选项做为第二个选项,若是第一个参数大于0,则waitpid会等待该pid结束,若是第一个参数是-1,则会等候全部子进程,也就和os.wait同样。windows
用os.system 和 os.exec函数族来执行系统命令和其它程序。os.system使用shell来执行系统命令,而后在命令结束以后把控制权返回给原始进程;os.exec函数族在执行完命令后不将控制权返回给调用进程。它会接管python进程,pid不变。这两个函数支持unix和windows平台。api
os.popen()函数可执行命令,并得到命令的stdout流。函数要取得两个参数,一个是要执行的命令,另外一个是调用函数所用的模式,如“r"只读模式。os.popen2()函数执行命令,并得到命令的stdout流和stdin流。函数返回一个元组,其中包含有两个文件对象,一个对象对应stdin流,一个对象对应stdout流。多线程
进程使用IPC机制在进程间传递信息,一种IPC机制是“管道”,它是一种相似于文件的对象,提供单向通讯渠道。父进程可打开一个管道,再分支一个子进程。父进程使用管道将信息写入(发送到)子进程,而子进程使用管道从父进程读取信息。在python中使用os.pipe函数建立管道。并发
os._exit()相似于sys.exit(),但它不执行任何的清除工做(例如刷新缓冲区)。因此os._exit()尤为适用于退出子进程。若是程序使用sys.exit(),操做系统会回收父进程或其它子进程可能仍然须要的资源。传给os._exit()函数的参数必须是进程的退出状态。退出状态为0,表示正常终止。异步
进程也可用信号进行通讯。所谓“信号”,是操做系统采起异步方式传给程序的消息。如CTRL+C会传递一个“中断信号”,一般该信号致使程序停止。然而程序彻底能够指定用不一样的行动来响应任何一个信号。在信号处理中,程序要接收信号,并根据那个信号采起一项行动。错误(例如向已关闭管道写入)、事件(例如计时器变成0)以及用户输入(例如按ctrl+c)都会产生信号。
针对每一个信号,每一个python程序都有一个默认的信号处理程序。例如,假定python解释器收到一个信号,该信号指出程序试图向已关闭的管道写入,或者用户敲入一个键盘中断,python就会引起一个异常。发生异常后,程序既可以使用默认处理程序,也可以使用自定义处理程序。
signal.signal函数为中断信号注册一个信号处理程序。函数要得到两个参数:一个信号和一个对应于信号处理程序的函数。
在unix/linux系统中,子进程终止后,会保留在进程表中,让父进程知道子进程是否正常终止。若是建立大量子进程,但在终止后没有从进程表中移除它们,进程表便会积累愈来愈多的死进程,这些进程称为“zombies”(僵尸进程),消除僵尸进程的操做称为“reaping”,这是经过os.wait和os.waitpid函数实现的。
进程应关闭不须要的管道端,由于操做系统限制了可同时打开的文件说明符数量。
并非全部操做系统都能从一个正在运行的程序建立单独的进程,因此,进程管理是移植性最差的一项python特性。
每一个系统都定义了特有信号集。signal是依赖于具体平台的模块,其中只包含系统定义的信号。
在python中,内置了文件(file)对象,通过一些内置的方法就可以实现对文件的操作,例如open()方法创建一个文件对象,write()方法向文件写入内容。
想要操作文件,先要创建或者打开指定文件并创建文件对象,可以通过内置函数open()来实现。
mode参数的参数值表
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
打开一个文件用于读写。文件指针将会放在文件的开头。 |
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
采用open()函数打开文件时,默认采用的是GBK编码,如果想要用其他编码方式,需要加上encoding参数
打开文件之后,需要及时关闭,以免对文件造成不必要的破坏。可以用内置函数close()。
close()函数先刷新缓冲区中还没有写入的信息,将其写入到文件中,再关闭文件,起到对文件的保护作用。
再写入文件的时候要注入打开文件的时候是处于什么模式,不然会把原数据覆盖掉。
读取文件的前提是在打开文件时,指定的打开模式为r(只读)或者r+(读写)否则,会抛出异常。
#size :用于指定要读取的字符个数,如果省略,则一次性读取所有内容。
该方法用于读取一行文本
python内置了os模块及子模块os.path用于对目录或文件的操作。
os模块提供的与目录相关的函数
返回指定路径下的文件和目录信息 |
把path设置为当前工作目录 |
获取指定文件是否有某个权限(accessmode的等于R_OK(读取),W_OK(写入),X_OK(执行),F_OK(存在)),如果有指定的权限,返回1,否则返回0. |
修改path指定文件的访问权限 |
将文件或目录src重命名为dst |
返回path指定文件的信息 |
os.path模块提供与目录有关的函数
用于获取文件或目录的绝对路径 |
用于判断目录或者文件是否存在,如果存在则返回True,否则返回False |
将目录与目录或者文件名拼接起来 |
从一个目录中提取文件名 |
从一个路径中提取文件路径,不包括文件名 |
demo —— 获取当前工作目录
demo —— 判断目录是否存在
因为exists()是os的子模块提供的,所以要要加前缀,os.path
demo —— 创建一级目录
mkdir(path)创建的目录是一级目录,如果传入的path中最后一级的上级目录不存在,那么会抛出异常。
demo —— 创建多级目录
rmdir()函数只能删除空的目录,如果不为空就不能删除,可以一下代码删除不为空的目录。
dirpath: 是一个字符串,表示当前遍历的路径
dirnames: 是一个列表,表示的是当前路径下包含的子目录
filenames: 也是一个列表,当前目录下的文件
demo —— 产找当前目录下某个文件是否存在
以上就是本文的全部内容,希望对大家的学习有所帮助。
在python中,内置了文件(file)对象,通过一些内置的方法就可以实现对文件的操作,例如open()方法创建一个文件对象,write()方法向文件写入内容。
想要操作文件,先要创建或者打开指定文件并创建文件对象,可以通过内置函数open()来实现。
mode : 用于指定文件打开的方式
mode参数的参数值表
以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。 |
打开一个文件用于读写。文件指针将会放在文件的开头。 |
以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
采用open()函数打开文件时,默认采用的是GBK编码,如果想要用其他编码方式,需要加上encoding参数
打开文件之后,需要及时关闭,以免对文件造成不必要的破坏。可以用内置函数close()。
close()函数先刷新缓冲区中还没有写入的信息,将其写入到文件中,再关闭文件,起到对文件的保护作用。
再写入文件的时候要注入打开文件的时候是处于什么模式,不然会把原数据覆盖掉。
读取文件的前提是在打开文件时,指定的打开模式为r(只读)或者r+(读写)否则,会抛出异常。
#size :用于指定要读取的字符个数,如果省略,则一次性读取所有内容。
该方法用于读取一行文本
python内置了os模块及子模块os.path用于对目录或文件的操作。
os模块提供的与目录相关的函数
返回指定路径下的文件和目录信息 |
把path设置为当前工作目录 |
获取指定文件是否有某个权限(accessmode的等于R_OK(读取),W_OK(写入),X_OK(执行),F_OK(存在)),如果有指定的权限,返回1,否则返回0. |
修改path指定文件的访问权限 |
将文件或目录src重命名为dst |
返回path指定文件的信息 |
os.path模块提供与目录有关的函数
用于获取文件或目录的绝对路径 |
用于判断目录或者文件是否存在,如果存在则返回True,否则返回False |
将目录与目录或者文件名拼接起来 |
从一个目录中提取文件名 |
从一个路径中提取文件路径,不包括文件名 |
demo —— 获取当前工作目录
demo —— 判断目录是否存在
因为exists()是os的子模块提供的,所以要要加前缀,os.path
demo —— 创建一级目录
#如果要创建的目录已经存在,则会抛出异常,先判断要创建的目录是否存在
mkdir(path)创建的目录是一级目录,如果传入的path中最后一级的上级目录不存在,那么会抛出异常。
demo —— 创建多级目录
#判断要删除的目录,如果不存在会抛出问题
rmdir()函数只能删除空的目录,如果不为空就不能删除,可以一下代码删除不为空的目录。
dirpath: 是一个字符串,表示当前遍历的路径
dirnames: 是一个列表,表示的是当前路径下包含的子目录
filenames: 也是一个列表,当前目录下的文件
top: 用于指定要遍历的目录 topdown: 可选参数,用于指定要遍历的顺序,如果为True(默认),表示从上到下遍历,如果为False,表示从小到上。
#root 是当前根路径,dirs包含路径下的子目录,files包含了子目录下的二五年间
demo —— 产找当前目录下某个文件是否存在
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。