多线程和进程最基本使用实现
import threading
import time
import os
def sing(name):
print(f'{name}:sing a song')
time.sleep(3)
print('sing done')
def dance(name):
print(f'{name}:dace')
time.sleep(2)
print('dance done')
th_sing = threading.Thread(target=sing,args=('mls',))
th_dance = threading.Thread(target=dance,args=('mls',))
th_sing.setDaemon(True)
th_dance.setDaemon(True)
print(th_sing.getName())
print(th_dance.getName())
th_sing.setName('th_sing')
th_dance.setName('th_dance')
print(th_sing.getName())
print(th_dance.getName())
th_sing.start()
th_dance.start()
th_sing.join()
th_dance.join()
print('all done')
'''
1.cpu对线程的调度是随机的,一下子start多个线程,其实是随机的,每次执行都不一定一样
2.资源抢占
互斥锁
lock = Lock()
lock.acquire()
lock.release()
线程调度最小单元
进程
1.程序跑起来就是一个进程(分配一定的内存)
2.一个进程默认有一个线程
3.进程是操作系统资源分配和调度的基本单位
'''
import multiprocessing
import time
def worker(pid):
for i in range(100000):
time.sleep(0.001 * pid) # 进程2故意慢1ms
print(f"进程{pid}输出: {i}", flush=True)
if __name__ == '__main__':
multiprocessing.Process(target=worker, args=(1,)).start()
multiprocessing.Process(target=worker, args=(2,)).start()
import os
def worker(pid):
for i in range(5): # 减少循环次数便于观察
print(f"进程{pid}输出: {i}", flush=True)
if __name__ == '__main__':
p1 = multiprocessing.Process(target=worker, args=(1,))
p2 = multiprocessing.Process(target=worker, args=(2,))
p1.start(); p2.start()
# 错误示例:频繁锁竞争导致性能下降
lock = multiprocessing.Lock()
def worker(pid):
for i in range(1000):
print(f"Process-{pid}: {i}", flush=True)
if __name__ == '__main__':
p1 = multiprocessing.Process(target=worker, args=(1,))
p2 = multiprocessing.Process(target=worker, args=(2,))
p1.start(); p2.start()
if __name__ == '__main__':
proc1 = multiprocessing.Process(target=worker)
proc2 = multiprocessing.Process(target=worker)
proc1.start()
proc2.start()
def sing(name):
print(f'{name}:sing a song')
print('sing:')
print(os.getpid())
print(os.getppid())
time.sleep(3)
print('sing done')
def dance(name):
print(f'{name}:dace')
print('dance:')
print(os.getpid())
print(os.getppid())
time.sleep(2)
print('dance done')
if __name__ == '__main__':
proc1 = multiprocessing.Process(target=sing,args=('jay',))
proc2 = multiprocessing.Process(target=dance,args=('jay',))
proc1.start()
proc2.start()
print(proc1.is_alive())
print(proc2.is_alive())
proc1.join()
proc2.join()
print(proc1.is_alive())
print(proc2.is_alive())
print(proc1.name)
print(proc2.name)
proc1.name = 'proc_sing'
proc2.name = 'proc_dance'
print(proc1.name)
print(proc2.name)
print(f'p1:{proc1.pid}')
print(f'p2:{proc2.pid}')
print(os.getpid())
'''
线程与进程:
线程是CPU调度的基本单位。
进程是资源分配的基本单位。
进程、线程、协程对比:
进程:切换需要的资源最大,效率最低。
线程:切换需要的资源一般,效率一般。
协程:切换需要的资源最小,效率高。
适用场景:
多线程适合IO密集型操作(如文件操作、爬虫)。
多进程适合CPU密集型操作(如科学计算)。
多任务完成:
进程、线程、协程均可完成多任务,选择需根据实际开发需求。
'''