面向对象编程
在使用多进程或者多线程时,对应模块可以直接使用,也可以继承之后,定制使用
import multiprocessing
import redis
class RedisProcess(multiprocessing.Process):
def __init__(self, db, key, value):
super().__init__() # 把实例化的对象变成进程对象
self.connect = redis.Redis(db=db) # 指定操作的库
self.key = key
self.value = value
# 设置键和值
def set(self):
self.connect.set(self.key,self.value)
# 在start方法调用的时候会自动调用run方法
def run(self):
print(multiprocessing.current_process())
self.set()
myReids1 = RedisProcess(0,'name','tlk')
myReids1.start()
等待子任务结束
进程或着线程添加 join 方法之后,会等待子任务结束,如果没有结束则会阻塞,直到子任务结束,
因此join一般都是放在程序的最后面
在正常情况下,主进程的结束,并不会影响子进程,但是也可以在主进程结束之后,强制终止子进程。
注意线程不能终止,只能等待结束
在Linux中,只要进程一创建,系统就会分配一个pid,在程序运行过程中,pid都不会改变。
可以通过pid查看进程对资源的使用情况,也可以通过PID来控制进程的运行。
线程还是在一个进程当中,因此不会有PID。
线程由python解释器调度,为了调度方便,会有ident,类似于操作系统中的pid。
开启守护模式之后,主进程结束,子进程会自动结束
import multiprocessing
import threading
import time
print(multiprocessing.current_process())
def new_time():
# 格式化时间,获取当前准确时间
return time.asctime(time.localtime(time.time()))
def fun():
print('inner-start', new_time())
print(multiprocessing.current_process())
time.sleep(5) # 休眠5秒钟,模拟耗时操作
print('inner-end', new_time())
print('outer-start', new_time())
# t1 = threading.Thread(target=fun)
# print('before:', t1.ident) # 未开启线程时没有id号 为None
# t1.start()
# print('after:', t1.ident) # 查看线程id号
# p1 = multiprocessing.Process(target=fun, name='子进程1')
# print('before:', p1.pid) # 未开启进程时没有id号 为None
# p1.start()
# print('after:', p1.pid) # 查看进程id号
p1 = multiprocessing.Process(target=fun, name='子进程1',daemon=True) #开启守护模式(主进程结束时,子进程也结束)
# print('before:', p1.is_alive()) # 查看进程是否存在
p1.start()
# print('after:', p1.is_alive()) #
time.sleep(2)
# p1.terminate() # 终止子进程
# p1.join() # 主进程等待子进程的结束
print('outer-end', new_time())