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

进程、线程、协程均可完成多任务,选择需根据实际开发需求。
'''
### 多线程基础概念 - 什么是Python多线程Python多线程有个全局解释器锁(global interpreter lock),任一时间只能有一个线程使用解释器,大家轮着用,这叫“并发”,不是“并行”[^2]。 - 多线程多进程的区别是什么?多线程多进程是并发编程的两种主要方式,多线程是在一个进程内创建多个线程执行不同任务,而多进程是创建多个独立的进程执行任务。Python多线程受全局解释器锁限制,同一时间只能有一个线程使用解释器,多进程则可利用多核CPU实现真正的并行执行[^1]。 ### 多线程工作原理 - Python多线程的工作原理是什么?Python多线程通过线程调度机制,在线程间切换执行。由于全局解释器锁的存在,多个线程只能并发执行,不能并行。在IO密集型任务中,当一个线程进行IO等待时,会自动切换到其他线程,从而不浪费CPU资源,提升程序执行效率[^3]。 - CPU在多线程中的运行机制是怎样的?CPU是多任务的,在多线程执行过程中,一段时间内会有多个线程被处理。一个线程从开始到结束是在期间的一系列时间片断上断断续续执行的,引出了程序执行的CPU时间(该程序单纯在CPU上运行所需时间)和墙上时钟wall time[^4]。 ### 多线程的优缺点与适用场景 - Python多线程的优缺点分别是什么?优点是对于IO密集型代码(文件处理、网络爬虫等),多线程能够有效提升效率,在线程A等待时,可自动切换到线程B,不浪费CPU资源。缺点是受全局解释器锁限制,对于CPU密集型任务,多线程不能提升执行效率[^3]。 - 多线程适用于哪些场景?多线程适用于IO密集型场景,如文件处理、网络爬虫等。在单线程下有IO操作会进行IO等待,造成不必要的时间浪费,而开启多线程能在线程等待时自动切换,提升程序执行效率。在实际的数据采集过程中,既考虑网速和响应的问题,也需要考虑自身机器的硬件情况,来设置多线程 [^3]。 ### 多线程的实现与使用 - 如何在Python中创建和启动一个线程?可以使用`threading`模块创建和启动线程,示例代码如下: ```python import threading def worker(): print('This is a worker thread.') # 创建线程对象 t = threading.Thread(target=worker) # 启动线程 t.start() ``` - 如何处理多线程中的共享资源问题?可使用锁机制,如`threading.Lock()`来处理共享资源问题,示例代码如下: ```python import threading # 创建锁对象 lock = threading.Lock() shared_resource = 0 def increment(): global shared_resource # 获取锁 lock.acquire() try: shared_resource += 1 finally: # 释放锁 lock.release() threads = [] for _ in range(10): t = threading.Thread(target=increment) threads.append(t) t.start() for t in threads: t.join() print(shared_resource) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值