Python多线程多进程

进程(Process)

是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

线程(Thread)

有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源
在单个程序中同时运行多个线程完成不同的工作,称为多线程。

线程与进程的区别

线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文。

Tips:
LoadRunner和Jmeter性能测试工具也利用了多线程和多进程来构造多个并发用户来执行性能测试。

单线程

单线程在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。

案例:一个学生先说话然后等待2秒开始进行写操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from time import ctime,sleep

def Talk():
print("Start talk %r" %ctime())
sleep(2)

def Write():
print("Start Write! %r" %ctime())
sleep(2)

if __name__=="__main__":
Talk()
Write()
print("All end %r" %ctime())

if name==”main“: 表示如果当前模块是被直接运行的,则该语句之后代码块被运行,如果模块是被导入的,则代码块不被运行。

先执行music 然后等2秒之后执行播放看视频 线性模式

多线程

多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。

案例: 让学生同时进行说和写操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from  time import ctime,sleep
import threading

def talk(content,loop):
for i in range(loop):
print("Start Talk %s %s" %(content,ctime()))
sleep(3)

def write(content,loop):
for i in range(loop):
print("Start Write %s %s" %(content,ctime()))
sleep(5)

threads=[]
t1=threading.Thread(target=talk,args=('Speak: Hello,51zxw',2))
threads.append(t1)

t2=threading.Thread(target=write,args=('Write: Life is Short You need Python!',2))
threads.append(t2)

if __name__=='__main__':
for t in threads:
t.start()
for t in threads:
t.join()
print("All the End %r" %ctime())

执行结果

1
2
3
4
5
Start Talk Speak: Hello!! Sat Jun 10 13:57:33 2017
Start Write Write: Life is Short You need Python! Sat Jun 10 13:57:33 2017
Start Talk Speak: Hello!! Sat Jun 10 13:57:36 2017
Start Write Write: Life is Short You need Python! Sat Jun 10 13:57:38 2017
All the End 'Sat Jun 10 13:57:43 2017'

两个线程同时启动,同时运行,然后根据各自执行的不同时间结果来结束

线程优化

  1. 将播放器合并
  2. 将创建线程的合并
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    from time import ctime,sleep
    import threading #threading有守护进程

    def super_play(file,time):
    for i in range(2):
    print(" Start playing %s %s" %(file,ctime()))
    sleep(time)

    lists={'世界.mp3':2,'心花怒放.avi':4}

    threads=[]

    #循环创建线程
    for file,time in lists.items():
    t=threading.Thread(target=super_play,args=(file,time))
    threads.append(t)

    if __name__=='__main__':

    for t in range(len(lists)):
    threads[t].start()

    for t in range(len(lists)):
    threads[t].join()

    print("end all %s" %ctime())

多进程

概要

与多线程相比,多进程就是import multiprocessing 然后替换相应的方法multiprocessing.Process()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from time import sleep,ctime
import multiprocessing

def talk(content,loop):
for i in range(loop):
print("Talk: %s %s" %(content,ctime()))
sleep(2)

def write(content,loop):
for i in range(loop):
print("Write: %s %s"%(content,ctime()))
sleep(3)

process=[]
p1=multiprocessing.Process(target=talk,args=('hello 51zxw',2))
process.append(p1)

p2=multiprocessing.Process(target=write,args=('Python',2))
process.append(p2)

if __name__=='__main__':
for p in process:
p.start()
for p in process:
p.join()
print("All process is Run %s" %ctime())

相关知识:

  • 进程间通信IPC(Interprocess communication)
  • 线程锁,进程锁
  • 生命周期
  • 进程调度