首页 > 技术文章 > 线程

michealjy 2019-09-17 22:30 原文

线程

线程杂谈

#线程:CPU最小的执行单位。
#进程:资源集合/资源单位
#线程运行:运行代码
#进程运行:各种资源 +线程

"""
右键运行:
	申请内存空间,先把解释器(解释器代码)丢进去并且把写的代码丢进去(进程做的),运行代码(线程)(解释器开启进程先解释我写的代码)。
	
	
	
进程和线程的区别:
线程 ==> 单指代码的执行过程
进程 ==> 资源的申请与销毁的过程



进程内存空间彼此隔离
同一个进程下的线程共享资源。

进程和线程的创建速度:
进程需要申请资源开辟空间  慢
只是告诉操作系统一个执行方案 快
"""

线程用法

#线程开启的方式一:
from threading import Thread
import time
# 进程等待所有线程结束才会结束
def task():
    print('子线程  开启')
    time.sleep(2)
    print('子线程  结束')

# if __name__ == '__main__':
'''
这句可以不需要加,因为线程执行不需要重新开启内存空间,
直接是让操作系统开线程,也不会出现开启子进程那种类似递归的
问题
'''
    t = Thread(target=task)
    t.start()
    print('主线程')

#线程开启的方式二(继承Thread类):
from threading import Thread
import time

class task(Thread):
    def run(self):
        print('子进程 开始')
        time.sleep(3)
        print('子进程 结束')

t = task()
t.start()
print('主线程')



#子进程和子线程的开启速度
from multiprocessing import Process
from threading import Thread
import time

def task(name):
    print(f'{name} start')
    time.sleep(2)
    print(f'{name} end')

if __name__ == '__main__':
    p = Process(target=task, args=('子进程', ))
    t = Thread(target=task, args=('子线程', ))
    t.start() #先打印子进程 start ,然后是 主, 最后是子进程 end
    # p.start()#先打印主,然后是子进程 start  最后是子进程 end
    print('主')

'''
进程和线程的创建速度
开启子进程需要申请资源开辟空间 慢
开启子线程只是告诉操作系统一个执行方案 快
'''

#子线程共享资源
from threading import Thread
import os

x = 100
def task():
    global x
    x = 50
    print(os.getpid()) #打印的是子线程的pid号
if __name__ == '__main__':
    t = Thread(target=task)
    t.start()
    print(x)
    print(os.getpid()) #打印的是主线程的pid号

'''
主线程和子线程共用一块内存空间,因为pid号相同,且x修改成功
'''

#线程的join方法

from threading import Thread
import time

def task(name, n):
    print(f'{name}{n} start')
    time.sleep(2)
    print(f'{name}{n} end')

if __name__ == '__main__':

    start = time.time()
    t1 = Thread(target=task, args=('子线程', 1))
    t2 = Thread(target=task, args=('子线程', 2))
    t3 = Thread(target=task, args=('子线程', 3))
    t1.start()
    t2.start()
    t3.start()
    t1.join() # 等待子线程运行结束
    t2.join() # 等待子线程运行结束
    t3.join() # 等待子线程运行结束
    end = time.time()
    print('主') #最后才运行 主
    print(end - start) #2.001624822616577


# 主进程和子线程的结束时间
from multiprocessing import Process
from threading import Thread
import time

def task():
    print('进程 开启')
    time.sleep(5)
    print('进程 结束')
def task2():
    print('子线程 开启')
    time.sleep(2)
    print('子线程 结束')

if __name__ == '__main__':
    p = Process(target=task)
    t = Thread(target=task2)
    t.start()
    p.start()
    print('子进程未开始')
    p.join() #主进程的主线程等待子进程运行结束
    print('主')

推荐阅读