8.6 python 日学 多任务 进程及线程

本文详细介绍了Python中的多任务处理,包括进程和线程的创建、状态、通讯以及实例应用。通过示例代码展示了如何使用`multiprocessing`和`threading`模块进行进程和线程的管理和同步,探讨了线程间共享全局变量可能导致的数据安全问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.进程
运行起来的程序成为进程,不运行时称为程序。程序和进程的关系是:程序只有一个,但是进程可以有多个。
创建多进程
from multiprocessing import Process
import time

def sing():

for i in range(10):

print(‘我在唱第{}句歌词’.format(i+1))

time.sleep(1)

def dance():

for i in range(10):

print(‘我在跳第{}段舞蹈’.format(i+1))

time.sleep(1)

if name == ‘main’:

t1=Process(target=sing)

t2=Process(target=dance)

t1.start()

t2.start()

2.进程的状态
在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞
3.进程之间的通讯
进程之间的通讯可以使用Queue队列

from multiprocessing import Queue

q=Queue(4)

q.put(‘baozi’)

q.put(‘xiangjiao’)

q.put(‘xigua’)

print(‘here’)

q.put(‘zhuzhouhzi’)

print(‘eat’)

while q.qsize()>0:

print(q.get())

from multiprocessing import Process,Queue

import time

def producer(q):

for i in range(10):

bz=‘baozi:%d’%(i+1)

print(‘produce’+bz)

q.put(bz)

time.sleep(1)

def consumer(q):

for i in range(10):

bz=q.get()

print(‘consumer’+bz)

if name == ‘main’:

q=Queue(3)

p1=Process(target=producer,args=(q,))

p2=Process(target=consumer,args=(q,))

p1.start()

p2.start()

4.进程池

from multiprocessing import Pool

import time

def hanshu(name):

for i in range(5):

print(name,i)

time.sleep(1)

if name == ‘main’:

p=Pool(3)

a=‘abcde’

for x in a:

# p.apply(hanshu,(x,))

p.apply_async(hanshu,(x,))

p.close()

p.join()

join 主进程等待所有子进程执行完毕,必须在close之后
close等待所有进程结束才关闭进程池
5.线程
进程是资源拥有者,创建、撤销与切换存在较大的内存开销,因此需要引入轻型进程,即线程。
进程是资源分配的最小单位,线程是cpu调度的最小单位(程序真正执行的时候调用的是线程),每一个进程中至少有一个线程。进程里面的所有线程共享进程里面的所有资源。
6.使用threading模块创建线程

from threading import Thread

import time

count=0

def hanshu1():

global count

time.sleep(1)

for i in range(10):

count+=1

print(‘hanhsu1’,count)

def hanshu2():

global count

time.sleep(1)

for i in range(10):

count+=1

print(‘hanhsu2’,count)

if name == ‘main’:

t1=Thread(target=hanshu1)

t2=Thread(target=hanshu2)

t1.start()

t1.join()

t2.start()

t2.join()

传递参数,通过线程关键字args=()进行传递参数

from threading import Thread

import time

def get(num):

for i in range(num):

print(i)

time.sleep(1)

if name == ‘main’:

t1=Thread(target=get,args=(5,))

# t1.setDaemon(True)将当前线程设置为守护线程,当主线程结束后,不管子线程有没有执行完毕,都会结束

t1.start()

print(‘over’)

setDeamon()方法
将当前线设置成守护线程来守护主线程
当主线程结束后,守护线程也结束,不管有没有执行完毕
注意,需要在子线程开启的时候设置成守护线程,否则无效

7.线程的一些实例方法,了解
getName()获取线程名称
setName()设置线程名称
isAlive()判断线程存活状态
8.threading提供的方法
threading.currentThread():返回当前线程变量
threading.enumerate():返回一个包含正在运行的线程list,不包括启动前和终止后的线程
threading.active_count()返回正在运行的线程数量

from threading import Thread

import time

import threading

def sing():

for i in range(10):

print(‘sing%d’%(i+1),threading.current_thread())

time.sleep(1)

def dance():

for i in range(10):

print(‘dance%d’%(i+1),threading.current_thread())

time.sleep(1)

if name == ‘main’:

t1=Thread(target=sing,name=‘ldh’)

t2=Thread(target=dance,name=‘zhm’)

t1.start()

t2.start()

print(threading.enumerate())

print(threading.active_count(),len(threading.enumerate()))

t1.join()

t2.join()

print(‘over’)

9.以继承的方式开启线程

import threading,time

from threading import Thread

class T(Thread):

def init(self,name):

super().init()

self.name=name

def run(self):

for i in range(10):

print(self.name,‘dance%d’%(i+1))

time.sleep(1)

class S(Thread):

def init(self,name):

super().init()

self.name=name

def run(self):

for i in range(10):

print(self.name,‘sing%d’%(i+1))

time.sleep(1)

if name == ‘main’:

t=T(‘zs’)

s=S(‘ls’)

t.start()

s.start()

10.线程之间共享全局变量

import threading

g_num=0

def hanshu1():

global g_num

g_num+=5

def hanshu2():

print(g_num)

if name == ‘main’:

t1=threading.Thread(target=hanshu1)

t2=threading.Thread(target=hanshu2)

t1.start()

t2.start()

11.共享全局变量的问题
多线程开发的时候共享全局变量会带来资源竞争效果,也就是数据不安全# import threading

g_num=0

def hanshu1():

global g_num

for i in range(10000000):

g_num+=1

print(g_num)

def hanshu2():

global g_num

for i in range(10000000):

g_num+=1

print(g_num)

if name == ‘main’:

t1=threading.Thread(target=hanshu1)

t2=threading.Thread(target=hanshu2)

t1.start()

t2.start()

多次运行会发现,全局变量没有按照想象中的那样运行,并给出了一个错误结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值