多进程
os.fork()(Linux)
#coding=utf-8
import os
print(os.getpid())#此处打印父进程的ID
pid = os.fork() #pid为生成的子进程ID
print(pid)
if pid == 0:
    print("I am child process (%s) and my parent is (%s)"
             %(os.getpid(),os.getppid()))

else:
    print("I (%s) just created a child process (%s)."
           %(os.getpid(),pid))


fork()函数,它也属于一个内建函数,并且只在Linux系统下存在。它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后分别在父进程和子进程内返回。子进程永远返回0,而父进程返回子进程的PID。这样做的理由是,一个父进程可以fork()出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID,子进程只需要调用os.getpid()函数可以获取自己的进程号。

os.getpid()
返回当前进程的ID

os.getppid()
返回当前进程的父进程ID

multiprocessing.process
help(multiprocessing.Process)
__init__(self, group=None, target=None, name=None, args=(),kwargs={})
参数说明:
group:进程所属组,基本不用。
target:表示调用对象,一般为函数。
args:表示调用对象的位置参数元组。
name:进程别名。
kwargs:表示调用对象的字典。


创建进程
示例1:

#coding=utf-8
import multiprocessing
def do(n):
    name = multiprocessing.current_process().name
    print(name,"starting")
    print("work", n)


if __name__ == "__main__":
    p_list = []
    for i in range(5):
        p = multiprocessing.Process(target=do,args=(i,))#args参数传入元素
        p_list.append(p)
        p.start()#启动子进程
    for p in p_list:
        p.join()#join()等待当前子进程执行结束
    print(p_list)


示例2:
#coding=utf-8
from multiprocessing import Process
import os
import time

def sleeper(name,seconds):
    print("Process ID# %s" %(os.getpid()))
    print("Parent Process ID#%s" %(os.getppid()))
    print("%s will sleep for %s seconds" %(name,seconds))
    time.sleep(seconds)

if __name__ == "__main__":
    child_proc = Process(target=sleeper,args=("bob",5))
    child_proc.start()
    print("in parent process after child process start")
    print("parent process about to join child process")
    child_proc.join()
    print("in parent process after child process join")
    print("the parent's parent process:%s" %os.getppid())


多进程模板程序
#coding=utf-8
from multiprocessing import Process
import urllib.request
import time

def func1(url):
    response = urllib.request.urlopen(url)
    html = response.read()
    print(html[:20])
    time.sleep(1)


def func2(url):
    response = urllib.request.urlopen(url)
    html = response.read()
    print(html[:20])
    time.sleep(1)


if __name__ == "__main__":
    p1 = Process(target=func1,args=("https://www.baidu.com",),name="gloryroad1")
    p2 = Process(target=func2,args=("https://www.sogou.com",),name="hhq")
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    time.sleep(1)
print("Done!")



测试单进程和多进程程序执行的效率
#coding=utf-8
import multiprocessing
import time

def m1(x):
    time.sleep(0.01)
    return x * x

if __name__ == "__main__":
    pool = multiprocessing.Pool(multiprocessing.cpu_count())
    i_list = range(1000)
time1 = time.time()
#并行执行进程池中的进程,此处把列表的每个值传给m1函数
    pool.map(m1,i_list)
    time2 = time.time()
    print("time elapse: ",time2 - time1)

    time1 = time.time()
    list(map(m1,i_list))
    time2 = time.time()
print("time elapse: ",time2 - time1)