Python里的多线程是假的多线程,不管有多少核,同一时间只能在一个核中进行操作!利用Python的多线程,只是利用CPU上下文切换的优势,看上去像是并发,其实只是个单线程,所以说他是假的单线程。
那么什么时候用多线程呢?
首先要知道:
●io操作不占用CPU
●计算操作占CPU,像2+5=5
Python的多线程不适合CPU密集操作型的任务,适合io密集操作型的任务,例如:SocketServer
如果现在再有CPU密集操作型的任务,那该怎么办呢?
首先说,多进程的进程之间是独立的,然后注意了,python的线程用的是系统的原生线程,python的进程也是用系统的原生进程,那原生进程是由操作系统维护的,说白了python只是利用C原生代码库的接口咵嚓起了个进程,真正的进程管理还是由操作系统来完成的,那么操作系统本身有GIL全局解释器锁吗?答案是没有的,且两个进程之间的数据是完全独立的,不能互相访问,所以不需要锁的概念,所以不存在GIL概念,所以在这种情况下,每个进程至少会有一个线程,如果现在我的操作系统是八核的,我起八个进程,然后每个进程里面都有一个线程,那么就相当于八线程了,八个线程跑在八核上,那么就相当于利用多核了,那么问题就解决了!
唯一的坏处是八个线程之间的数据是不能共享的,独立的!利用这种方法可以折中的解决多核运算的问题!
先看一段简单的多进程的程序:
import multiprocessing import time def run(name): time.sleep(2) print('hello', name) if __name__ == '__main__': for i in range(10): p = multiprocessing.Process(target=run, args=('bob%s'%i,)) p.start()
程序的执行结果为:
hello bob0
hello bob1
hello bob3
hello bob2
hello bob5
hello bob9
hello bob7
hello bob8
hello bob4
hello bob6
那么,如果我想取我的进程号,那该怎么取呢?
from multiprocessing import Process import os def info(title): print(title) print('module name:', __name__) print('parent process:', os.getppid()) # 父进程ID print('process id:', os.getpid()) # 自己进程的ID print(" ") def f(name): info('