进程 process : 一个程序的执行实例 拥有字节独立资源,数据和主进程
线程 thread : 同一进程可被并行激活的控制流,共享相同空间地址,数据结构
(注:存在Python GIL 全局解释器锁 全局而言,本质上一个线程执行)
为了节约资源的使用, 在一个进程中往往存在多个线程,那如何实现多线程操作?
1.使用import Threading.thread()建立线程
import time
impoer threading
def worker(n):
print(f"函数开始执行于:{time.ctime()}")
print('当前线程的名字是: ', threading.current_thread().name) #获取当前线程名称
time.sleep(n)
print (f"函数结束于:{time.ctime()},前线程的名字是: '{threading.current_thread().name}")
def main():
print(f"主函数开始{time.ctime()}")
threads=[] #使之同时启动
t1=threading.Thread(target=worker,args=(4,)) #traget参数,执行函数。args传递参数
threads.append(t1)
t2 = threading.Thread(target=worker, args=(2,))
threads.append(t2)
for t in threads:
t.start()
for t in threads:
t.join()
print(f"主函数结束于{time.ctime()}")
if __name__ == '__main__':
main()
2 通过派生类实用线程
import threading
import time
def worker(n):
print(f"函数开始执行于:{time.ctime()}")
print('当前线程的名字是: ', threading.current_thread().name)
time.sleep(n)
print (f"函数结束于:{time.ctime()},前线程的名字是: '{threading.current_thread().name}")
class MyThread(threading.Thread):
def __init__(self,func,args):
threading.Thread.__init__(self)
self.func = func
self.args = args
def run(self): #定义线程启动函数,和下文对应star相呼应
self.func(*self.args)
def main():
print(f"主函数开始{time.ctime()}")
threads=[] #使之同时启动
t1=MyThread(worker,args=(4,))
threads.append(t1)
t2 = MyThread(worker, args=(2,))
threads.append(t2)
for t in threads:
t.start()
for t in threads:
t.join()
print(f"主函数结束于{time.ctime()}")
if __name__ == '__main__':
main()
3 同步锁 threading.Lock()
将多线程锁住,使得信息流通不出现问题
eggs=[]
lock = threading.Lock() #锁
def put_egg(n,lst):
lock.acquire() #锁上
for i in range(1,n+1):
time.sleep(random.randint(0,2))
lst.append(i)
lock.release()
def main():
threads=[]
for i in range(3):
t=threading.Thread(target=put_egg,args=(5,eggs))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
print(eggs)
if __name__ == '__main__':
main()