多线程与多进程的区别
多线程是单个内核通过锁的手段实现同一时间运行多个程序,在某些情况下可以提升总体的运行效率。同时为了防止多个线程在对同一数据进行修改时导致的不可预测的后果,需要借助锁、队列等保证进程的同步。
多进程是多个内核执行多个任务,可以实现一时间完成多个任务,保证提升效率
python中的多线程
import threading
print(threading.active_count()) # 查看当前线程数量
print(threading.enumerate()) # 查看所有线程名称
print(threading.current_thread()) # 查看当前正在运行的线程的名词
指定新线程内容和名称,并启动
def job():
print("I'm a new threading!")
def main():
my_threading = threading.Thread(target=job, name="T1") # 定义新的线程
my_threading.start()
if __name__ == "__main__":
main()
join方法,把分支加入到主线程中
import time
def job2():
for _ in range(10):
time.sleep(0.1)
print("I'm the second threading!")
# 合并了多个线程
def run1():
my_threading = threading.Thread(target=job, name="T1")
my_threading2 = threading.Thread(target=job2, name='T2')
my_threading.start()
my_threading2.start()
my_threading.join()
my_threading2.join()
print("Finished!",end='\n\n')
run1()
# 没有合并多个线程
def run2():
my_threading = threading.Thread(target=job, name="T1")
my_threading2 = threading.Thread(target=job2, name='T2')
my_threading.start()
my_threading2.start()
print("Finished!")
run2()
利用Queue队列完成多线程数据的存取
因为新线程的函数是无法使用return完成数据的返回,因此需要借助队列完成数据放入和取出操作
from queue import Queue
def job(l, q):
"""
l: 被操作的list数据
q:存储操作后数据的队列
线程的工作内容,对每个list执行平方的操作
"""
for i in range(len(l)):
l[i] = l[i]**2
q.put(l[i]) # 队列存放运算后的数据
def multithreading(data):
q = Queue()
for i in range(4):
t = threading.Thread(target=job, args=(data[i],q))
t.start() # 启动线程
t.join() # 合并线程到主线程中
results = [] # 存放每个线程运算的结果
for _ in range(4):
results.append(q.get()) # 取出队列的数据放入结果中
print(results)
multithreading([[1,2,3], [2,3,4], [3,4,5], [4,5,6]])