import os
import time
# fork可以用于创建子进程,只用用于linux/unix下面,无法在windows下面使用
pid = os.fork() # fork会新建一个子进程
print("Tom")
if pid == 0: # fork创建的子进程的行为,与多线程的行为不同。有何不同? fork会返回两次,PID就是子进程的id。如果PID==0,它实际上就是子进程。
print("子进程是:{}, 父进程是:{}".format(os.getpid(),os.getpid()))
else:
print("我是父进程是:{}".format(pid))
time.sleep(2) # 此处必须要有该语句,否则父进程执行完毕后就直接退出,
# 子进程由于运行时父进程已经提前退出,导致子进程无法结束,退出。
# 通过sleep,如果子进程执行完毕,父进程就会在sleep结束后,提出,并把子进程kill掉
Tom
我是父进程:24774
Tom
子进程:24774 , 父进程24773.
为什么print语句执行两次?为什么if/else两边都执行?
pid=os.fork(),它会fork一个子进程,但是父进程依然继续向下运行,父进程执行时,先打印Tom,后续判断只能满足一个,即执行else语句。
子进程会将父进程所有的数据原样copy到子进程中,包括代码运行,因此进程间的数据是完全隔离的(线程可以通过全局变量通信,但是进程不可),每个进程都有完整的自己的数据。子进程也会运行一遍从fork之后的代码,因此它也打印Tom,子进程中pid=0,因此执行。。。
import multiprocessing
import time
from concurrent.futures import ProcessPoolExecutor
def get_html(n):
time.sleep(2)
print("Sub_progress success")
return n
if __name__ == "__main__":
progress = multiprocessing.Process(target = get_html,args=(2,))
progress.start()
progress.join()
print("main progress end")
Sub_progress success
main progress end
有多少个cpu核,就可生成多少个进程。
import multiprocessing
import time
from concurrent.futures import ProcessPoolExecutor
def get_html(n):
time.sleep(2)
print("Sub_progress success")
return n
if __name__ == "__main__":
progress = multiprocessing.Process(target = get_html,args=(2,))
print(progress.pid)
progress.start()
print(progress.pid)
progress.join()
print("main progress end")
# 使用线程池
pool = multiprocessing.Pool(multiprocessing.cpu_count())
result = pool.apply_async(get_html,args=(3,))
# 等待所有任务完成
pool.close()
pool.join() # 在调用pool.join()之前,必须先调用pool.close()方法,让pool不再接收新的任务,否则会报异常
print(result.get())
None
17640
Sub_progress success
main progress end
Sub_progress success
3
import multiprocessing
import time
def get_html(n):
time.sleep(2)
print("Sub_progress success")
return n
if __name__ == "__main__":
pool = multiprocessing.Pool(multiprocessing.cpu_count())
# imap
for result in pool.imap(get_html, [1, 5, 3]):
print("{} sleep success".format(result))
Sub_progress success
1 sleep success
Sub_progress success
5 sleep success
Sub_progress success
3 sleep success
发现完成顺序与添加顺序一致。