多线程的应用场景 不适用cpu操作密集型任务, 适合io操作密集型任务
同一进程中的数据是互通的,因为python多线程是假多线程,我们要用到多核就需要开多个进程来实现,但是坏处是数据不能互通
线程:是操作系统最小的调度单位,是一串指令的集合
进程:eg:QQ要以一个整体的形式暴露给操作系统管理,里面包含对各种资源的调用,内存对各种资源管理的集合叫做进程
进程操作cpu必须先创建一个线程,只有线程才能操作cpu
所一在同一进程中的线程是共享同一片内存空间的,但是两个线程不能在同一块空间里运作
主线程和子线程运行是并行的
import threading import time def run(name): print('in the %s' % name) time.sleep(2)
首先我们设置一个函数我们开启两个线程
t2 = threading.Thread(target=run,args=('t2',)) t1 = threading.Thread(target=run,args=('t1',)) t1.start() t2.start()
你就会看到 并行的结果了,可是出现了一个问题 我们向要在进程结束后使用其结果该怎么办呢?
我们可以使用join哦
star_time = time.time() r_obj = [] for i in range(50): t = threading.Thread(target=run, args=('t %s' % i, )) t.setDaemon(True) # 把子线程设置成守护线程 t.start() r_obj.append(t) for i in r_obj: i.join()
可以看到我们把每一个进程丢进了数组,来是他们结束那么后面我们就可以达到效果了
顺便提一下我们还有一个使用类的方法来开多进程哦
# class Mythraed(threading.Thread): # def __init__(self,name): # super(Mythraed, self).__init__() # self.name = name # # def run(self): # print('run the %s',self.name) # time.sleep(2) # t1 = Mythraed('t1') # t2 = Mythraed('t2') # t1.start() # t2.start()
注意 python的线程是调用操作系统的源生线程,python在一时间内只能在一核中运行
如果你是2.x记得加锁哦不然会出现差错
local = threading.local() # 加锁首先生成实例 def run(name): global num local.acquire() # 上锁 num += 1 local.release() # 解锁 print('in the %s' % name)
2.进程(multiprocessing)
同理进程也和线程一样的开启方式,也是start一下 也可以join
for i in range(10): p = multiprocessing.Process(target=run, args=('liu%s' % i,)) p.start()
需要注意的是,每个进程都有一个父进程衍生出来,所以 查看进程的pid可以用os来查看,
如果你用pycharm写了一个程序那么这个程序的父亲进程pid就是pychram在电脑中的pid
查看父亲进程用
os.getppid()
查看当前进程的pid用
os.getpid()