并发多线程

Process类

使用multiprocess 一个多元化进程模块。(涵盖了和进程相关的多有内容)

Process类帮助你启动和停止进程。(Process().start()  ; Process().terminate())

使用Process类创建一个子进程
import os
import time
from multiprocessing import Process
def func(a,b,c):
    time.sleep(5)
    print(a,b,c,os.getpid(),os.getppid())

if __name__ == '__main__':
    print('主:', os.getpid())
    Process(target=func,args=(1, 2, 3)).start()
    Process(target=func,args=(2, 3, 4)).start()
    Process(target=func,args=(3, 4, 5)).start()

(注: __name__==__mian__ 中的代码为主代码(父进程),调用的func()为子进程,父进程中的os.getpid()==子进程中的os.getppid(), 子进程中的os.getpid为子进程的进程ID)

(同时注意参数的加入方式)

其他操作方法

import os
import time
from multiprocessing import Process

def func(a,b,c):
    time.sleep(3)
    print(a,b,c,os.getpid(),os.getppid())

if __name__ == '__main__':
    print('主;',os.getpid())
    p = Process(target=func,args=(1,2,3))
    p.start()
    print(p.is_alive())
    p.terminate()
    print(p.is_alive())
    time.sleep(1)
    print(p.is_alive())
    p.name = 'douniwan'
    print(p.name)
    print(p.pid)
    print(p.__dict__)

(注: p.is_alive()查看进程是否运行着,p.terminate()关闭进程,但不会立即关闭,方式为:并行非阻塞,会过一会关闭,进程关闭后可以继续查看和更改实例化进程的属性)

开启多个子进程

import os
import time
from multiprocessing import Process
def func(a,b,c):
    time.sleep(3)
    print(a,b,c,os.getpid(),os.getppid())


if __name__ == '__main__':
    Process(target=func,args=(1,2,3,)).start()
    Process(target=func,args=(2,3,4)).start()
    Process(target=func,args=(3,4,5,)).start()
    Process(target=func,args=(4,5,6,)).start()
    

#两种方法
  for i in range(1,4): Process(target=func,args=(i, i+1, i+2)).start()

join

#join
import time
import random
from multiprocessing import Process

def send_mail(name):
    time.sleep(random.uniform(1,3))
    print('已经给%s发送邮件完毕'%name)

if __name__ == '__main__':
    lst = ['alex','yuan','宝元','太白']
    阻塞等待一个子进程结束
    p = Process(target=send_mail, args=('alex',))
    p.start()
    p.join()   # 阻塞,直到p对应的进程结束之后才结束阻塞
    print('所有的信息都发送完毕了')

    p_l = []
    for name in lst:
        p = Process(target=send_mail,args=(name,))
        p.start()
        p_l.append(p)
    for p in p_l : p.join()
    print('所有的信息都发送完毕了')

注意 join的使用 先把要阻塞的进程存放到列表里 然后分别与join结合。

进程守护

import time
from multiprocessing import Process

def func():
    for i in range(20):
        time.sleep(0.5)
        print('in func')

def func2():
    print('star : func2')
    time.sleep(5)
    print('end : func2')

if __name__ == '__main__':
    p = Process(target=func)
    p.daemon = True
    p.start()
    p2 = Process(target=func2)
    p2.start()
    print('in main')
    time.sleep(3)
    print('finished')
    p2.join

进程守护 p.daemon=True  守护主程序代码完成就结束     p2.join 为p2阻塞   在怕p2完成之前主程序代码没有结束。如果不加p2.join 主程序代码完成后就结束 会导致p2没有完成   。(p1始终没有运行完)

原文地址:https://www.cnblogs.com/qj696/p/10711356.html