Python-多任务-进程

fork创建进程

import os
ret = os.fork()

例子

import os
import time

ret = os.fork()
if ret==0:
    while True;
        print("---1---")
        time.sleep(1) #1s
else:
    while True:
        print("---1---")
        time.sleep(1)

主进程不会等待子进程结束

子进程是是一个独立的进程,不会因为主进程的结束而结束,主进程也不会等待子进程结束后再结束

获取进程ID,父进程ID

import os
os.getpid()#获取本进程ID
os.getppid()#获取父进程ID

全局变量在多个进程中不共享

import os
import time
num = 100
ret = os.fork()
if ret==0:
    print("---process1--%d"%++num)
else:
    time.sleep(1)
    print("---process2--%d"%num)

#在process1里num=101
#而在process2里num依然100

多次fork

import os
os.fork()
os.fork()
os.fork()
#即将会产生8个进程(2^fork数)

fork炸弹

import os
while True:
    os.fork()

Process创建进程

from multiprocessing import Process
def test():
    print("--test--")
p = Process(target=test)
p.start()#开启进程 

主进程会先等待Process子进程结束后再结束

from multiprocessing import Process
import time

def test():
    for i in range(5):
        print("--test--")
        time.sleep(1)

p = Process(target=test)
p.start()

#主进程会等待子进程结束后才结束

join

进程阻塞

p = Process(target=test)
p.start()#开启进程
p.join()#阻塞主进程,主进程必须等待p进程结束后才能执行下面句子
p.join(1)#阻塞1秒,若不能再指定时间内完成,则主进程可以执行下面句子

继承Process来创建进程

操作将会在重写的run方法里实现

from multiprocessing import Process
class MyProcess(Process):
    def run(self):
        print("--MyProcess-run--")

p = MyProcess()
p.start()

进程池

主进程不会等待子进程结束

问题:主进程结束了后,进程池会被销毁,故子进程也会销毁

解决:进程池.join()方法阻塞主进程

from multiprocessing import Pool
import time
import os

def test(i):
    for x in range(5):
        print("---test-%d-%d-%d"%(os.getpid(),i,x))
        time.sleep(1)

po = Pool(3)

for i in range(5):
    print(i)
    po.apply_async(test,(i,))

po.close()
po.join()

进程池.apply

同步执行排队的进程任务,每次从进程池单独拿出一个进程,进程执行任务,执行时阻塞父进程,执行完一个进程任务后,再去从进程池拿出进程,再去执行下一个进程的任务,直至所有任务执行完毕

如上,进程池有3个进程,5个任务,

首先从进程池拿出进程X从任务队列获取任务1,执行任务,阻塞主进程,执行完毕

然后从进程池拿出进程X从任务列表获取任务2,执行任务,阻塞主进程,执行完毕

进程池.apply_async

异步执行排队的进程任务,尽可能从进程池拿出空闲进程来分配进程任务,各个进程异步执行(同时执行)各自所分配的任务,进程在执行任务的时候并不会阻塞父进程.

进程间通讯-Queue

创建Queue

from multiprocessing Queue
q = Queue(3)#最大size=3

put阻塞放进元素

q.put("--q1--")
q.put("--q2--")
q.put("--q3--")
q.put("--q4--") #由于max size=3,故阻塞等待有空位置

get阻塞获取元素

q.get() #若队列为empty则阻塞等待有内容为止

put_nowait非阻塞放进元素

若满,则抛异常

get_nowait非阻塞获取元素

若empty,则抛异常

进程池中进程之间的通信Queue

from multiprocessing import Manager

q = Manager().Queue()

多进程copy文件

import os
#获取old文件夹名
oldFoldName = input()
#创建一个文件夹
os.mkdir("")
#获取old文件夹中所有文件名
os.listdir("")
#使用多进程copy文件
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值