多进程与多线程在不同环境中的操作
多进程
在Linux中创建进程,操作系统会将父进程的内容复制到子进程中。
import os
import time
pid = os.fork()
if pid == 0:
print(f"子进程{os.getpid()},父进程{os.getppid()}")
else:
print(f"父进程开始等待子进程运行结束,子进程id:{pid}")
time.sleep(10)
print("运行结果:")
print("父进程开始等待子进程运行结束,子进程id: 1812")
print("子进程1812,父进程1811")
在Windows中创建进程,类似于模块导入。
import multiprocessing
import time
print(f'mainprocess start {time.asctime(time.localtime(time.time()))} {multiprocessing.current_process()}')
def func():
print(f'subprocess start: {time.asctime(time.localtime(time.time()))}')
time.sleep(5)
print(f'subprocess end: {time.asctime(time.localtime(time.time()))}')
if __name__ == '__main__':
p = multiprocessing.Process(target=func)
p.start()
time.sleep(5)
print(f'mainprocess end {time.asctime(time.localtime(time.time()))}')
守护进程
使用`p.daemon = True`可以让主进程直接执行,不等待子进程,主进程结束子进程也会结束。`p.join()`可以阻塞主进程直到子进程结束。
面向对象化的多进程
import multiprocessing
import time
class ClockProcess(multiprocessing.Process):
def __init__(self):
super().__init__()
def run(self):
time.sleep(3)
n = 5
while n > 0:
print(f'the time is {time.time()}')
n -= 1
if __name__ == '__main__':
for i in range(5):
p = ClockProcess()
p.start()
在Windows和Linux下都会生成6个进程,一个主进程,5个子进程。注意程序中有`input()`时,子进程会报错。可以导入`os`和`sys`模块,添加`sys.stdin = os.fdopen(0)`。
多线程
线程是轻量级的进程,需要重写初始化和run方法。
import threading
import time
class MyThread(threading.Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print(f'I am is {self.name}')
time.sleep(3)
if __name__ == '__main__':
start_time = time.time()
thread_list = []
for i in range(10):
t = MyThread(f'线程{i}号')
t.start()
thread_list.append(t)
for i in thread_list:
i.join()
print(time.time() - start_time)
守护线程
import threading
import time
def func():
time.sleep(6)
print('子线程执行结束')
if __name__ == '__main__':
t = threading.Thread(target=func)
t.setName('线程1号')
print(t.getName(), t.name)
t.start()