多进程和多线程总是傻傻分不清,查阅资料得知主要区别有两点
- 一个进程可能包含多个线程,也就是线程概念小于进程
- 多线程共享进程数据,共享简单,但同步复杂,相反,多线程数据是分开,但同步简单
多进程
多进程我一遍会使用multiprocessing包
from multiprocessing import Process
def fun1(name):
print('测试%s多进程' %name)
if __name__ == '__main__':
process_list = []
for i in range(5): #开启5个子进程执行fun1函数
p = Process(target=fun1,args=('Python',)) #实例化进程对象
p.start()
process_list.append(p)
for i in process_list:
p.join()
print('结束测试')
join()方法可以在当前位置阻塞主进程,带执行join()的进程结束后再继续执行主进程的代码逻辑,也就是说,加了join(),主进程会等待在这里直到多进程执行完毕,再执行。 不加join,主程序会继续执行,不会等待多进程结束
除了直接写进程,还能使用进程池
from multiprocessing import Process,Pool
def fun1(name):
print('Run task %s (%s)...' % (name, os.getpid()))
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print('Task %s runs %0.2f seconds.' % (name, (end - start)))
if __name__=='__main__':
pool = Pool(5) #创建一个5个进程的进程池
for i in range(10):
pool.apply_async(func=fun1, args=(i,)) #apply是同步,apply_async是异步
pool.close()
pool.join()
print('结束测试')
多线程
多线程我一般会用threading
import threading
def fun1(name):
print('测试%s多线程' %name)
if __name__ == '__main__':
for i in range(10):
t = threading.Thread(target=fun1, args=(str(i),))
t.start()