多进程
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)
多进程(一)
原创
©著作权归作者所有:来自51CTO博客作者qq5a16e6241946e的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:Python操作MySQL(2)
下一篇:多进程(二)

提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
java 多进程
一个项目分多进程目的是为了分解压力。
java 项目