Python 高级编程和异步IO并发编程 --11_10 多进程编程

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

发现完成顺序与添加顺序一致。

发布了309 篇原创文章 · 获赞 120 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/f2157120/article/details/105109509