1、多线程的应用场景


  关于多线程的用法,但Python多线程并不能真正能发挥作用,因为在Python中,有一个GIL,即全局解释锁,该锁的存在保证在同一个时间只能有一个线程执行任务,也就是多线程并不是真正的并发,只是交替得执行。假如有10个线程炮在10核CPU上,当前工作的也只能是一个CPU上的线程。

  虽然Python多线程有缺陷,总被人说成是鸡肋,但也不是一无用处,它很适合用在IO密集型任务中。I/O密集型执行期间大部分是时间都用在I/O上,如数据库I/O,较少时间用在CPU计算上。因此该应用场景可以使用Python多线程,当一个任务阻塞在IO操作上时,我们可以立即切换执行其他线程上执行其他IO操作请求。

总结:Python多线程在IO密集型任务中还是很有用处的,而对于计算密集型任务,应该使用Python多进程。


2、多进程基本语法使用


Python环境中IO 操作不占用CPU;计算型的任务占用CPU,如数学运算。
Python多线程,不适合CPU密集操作型的任务,适合IO操作密集型的任务。

   multiprocessing是一个使用类似于线程模块的API来支持产卵进程的软件包。多处理包提供本地和远程并发,通过使用子进程而不是线程有效地侧移全局解释器锁。由于这个原因,多处理模块允许程序员充分利用给定机器上的多个处理器。它可以在Unix和Windows上运行。简单来说,就是对多核CPU的使用,提高利用率.

多进程的基本语法:多进程的语法与多线程的语法,基本差不多;两个进程之间的内存是独立。

1、启动进程的语法与threading相似
举例:



import multiprocessing,time

def run(n):
    time.sleep(2)
    print("run thread %s " % n)

if __name__ == "__main__":
    for i in range(5): #起了10进程
        t = multiprocessing.Process(target=run,args=(i,))
        t.start()
输出:
run thread 0 
run thread 1 
run thread 2 
run thread 3 
run thread 4



 2、在启动的进程中,启动线程

thread.get_ident(): 获得一个代表当前线程的魔法数字,常用于从一个字典中获得线程相关的数据。这个数字本身没有任何含义,并且当线程结束后会被新线程复用。

举例:



import multiprocessing,time,threading

def thread_run():
    print(threading.get_ident())

def run(n):
    time.sleep(1)
    print("run thread %s " % n)
    t = threading.Thread(target=thread_run)
    t.start()

if __name__ == "__main__":
    for i in range(5): #起了5进程
        t = multiprocessing.Process(target=run,args=(i,))
        t.start()
输出:
run thread 0 
123145535254528

run thread 1 
123145449709568

run thread 2 
123145319686144

run thread 3 
123145321574400

run thread 4 
123145500794880



 3、每个子进程的启动,都会有一个父进程。

举例:



3、每个子进程的启动,都会有一个父进程。
举例:
import  multiprocessing
import  os

def  info(title):
    print(title)
    print ("module_name:",__name__)
    print ("主进程ID:",os.getppid())#主进程ID号
    print ("子进程ID:",os.getpid()) #子进程ID号
    print("\n")

def run(name):
    info("\033[31;1mcalled from child proces function f\033[0m")
    print('hello',name)

if __name__ == "__main__":
    info("\033[32;1mcalled from child proces function f\033[0m")
    p = multiprocessing.Process(target=run,args=("chen",))
    p.start()

输出:
called from child proces function f
module_name: __main__
主进程ID: 799
子进程ID: 12948

called from child proces function f
module_name: __main__
主进程ID: 12948
子进程ID: 12949

hello chen