pyhton - 进程与线程
进程
Process类
def task(a):
for i in range(4):
print(a)
def task1(a):
for i in range(4):
print(a)
if __name__ == '__main__':
p = Process(target=task, args=("小名", )) # 创建进程
p.start() # 启动进程
p1 = Process(target=task, args=("小红", ))
p1.start()
自定义进程
建一个类,继承Process,重写run方法
class MyProcess(Process):
def __init__(self, name):
super(MyProcess, self).__init__()
self.name = name
def run(self):
for i in range(4):
time.sleep(0.5)
print(self.name)
if __name__ == "__main__":
a = MyProcess("小红")
b = MyProcess("小名")
a.start()
b.start()
进程池
p = Pool(5)
"""
阻塞式: apply(fun, args=(1,), kwds=")
非阻塞式:apply_async(fun, args=(1,), kwds="", callback=)
"""
def task(task_name):
print("开始任务:", task_name)
start = time.time()
time.sleep(random() * 2)
end = time.time()
return "任务完成! 用时:{}".format(end - start), "进程id:{}".format(os.getpid())
container = []
def call_back(n):
container.append(n)
if __name__ == '__main__':
pool = Pool(5)
tasks = ['听音乐', '吃饭', '睡觉', '打豆豆', '玩游戏', '生孩子', '跳舞']
for task1 in tasks:
pool.apply_async(task, args=(task1,), callback=call_back)
pool.close()
pool.join() #插队,排在主线程前面
for i in container:
print(i)
print("进程结束")
线程
进程里面包含多个线程,线程共用进程资源
def task1(a)
for i in range(4):
print("aaa",a)
def task2(a)
for i in range(4):
print("bbb",a)
def task3(a)
for i in range(4):
print("ccc",a)
if __name__ == "__main__":
t1 = threading.Thread(target=task1, name="线程1", args=(1, ))
t2 = threading.Thread(target=task2, name="线程2", args=(2, ))
t3 = threading.Thread(target=task3, name="线程3", args=(3, ))
t1.start()
t2.start()
t3.start()
自定义线程
class MyThreading(Thread):
def __init__(self, name):
super(MyThreading, self).__init__()
self.name = name
def run(self):
print("自定义线程", self.name)
if __name__ == '__main__':
t1 = MyThreading("线程")
t1.start()
共享数据
进程共享数据与线程共享数据的区别:
进程是每个进程都有一份
线程是共同一个数据 -》 数据安全
GIL -》 伪线程 ,pyhton创建线程后会自动解锁,需要手动加锁(线程同步)
用锁时,可能会导致 死锁,如何避免死锁:可以在 acuqire()中加 timeout=5,来避免死锁
lock = Threading.Lock()
def task():
lock.acquire()
for i in range(10):
time.sleep(0.5)
print("aaaa")
lock.release()
线程间通信:生产者与消费者
生产者: 线程
消费者:线程
def task(q):
text = ['aaa', 'bbb', 'ccc', 'ddd']
for i in text:
q.put(i)
def tesk1(q):
while True:
try:
text = q.get(timeout=2)
print(text)
except:
print("全部打印成功")
break
if __name__ == "__main__":
q = queue.Queue()
t1 = threading.Thread(target=task, args=(q, ))
t2 = threading.Thread(target=task, args=(q, ))
t1.start()
t2.start()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)