父进程创建线程子进程,子进程相当于父进程复制了一份,两个子进程的数据不共享。
两个线程共享同一份数据,同一个进程中的线程之间可以通行
一个线程可以控制和操作同一个进程里的其他线程,但是进程只能操作子进程
主线程和子线程是并发执行的,没有逻辑先后之分
1. 创建一个新的线程

import threading def testrun(x): a = 1 while True: a+=1 print("task",a) t1 = threading.Thread(target=testrun,args = (1,)) #注意, 方法不能加括号, 一个参数也应该加 逗号 t1.start()
2. 使用类创建线程
import threading import time class myThread(threading.Thread): def __init__(self,n): super(myThread,self).__init__() self.n = n def run(self): #函数名必须为 run print("class task",self.n) time.sleep(2) x1 = myThread(1) x2 = myThread(2) x1.start() #x1.join() #程序变成串行,等待x1执行结束 x2.start() x1.join() #= wait()等待线程x1执行完成 x2.join()
3. join()函数详解
等待该线程执行结束才执行下一行代码,可以实现线程的串行
import threading import time def testrun(x): print("task",x) time.sleep(2) start = time.time() tastlist = [] for i in range(50): t1 = threading.Thread(target=testrun,args=(i,)) tastlist.append(t1) t1.start() for t in tastlist: #每一个线程都join(),d等待最后一个线程执行结束 t.join() endtime = time.time()-start print("end",endtime)
4.
threading.current_thread() 返回当前的线程
threading.active_count() 统计线程的个数
5. 守护线程,
主线程退出后守护线程不管有没有执行完成,都要退出
设置应该放在 start()函数之前

t1 = threading.Thread(target=testrun,args = (1,)) #注意, 方法不能加括号, 一个参数也应该加 逗号 t1.setDaemon(True) #将该线程设置为 守护线程 t1.start()
6. 全局锁,python代码同一时刻只有一个线程在运行