面试-python-多线程多进程基本使用

多线程和进程最基本使用实现

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密集型操作(如科学计算)。
‌多任务完成‌:

进程、线程、协程均可完成多任务,选择需根据实际开发需求。
'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值