一.关于线程和进程的说明
python本身没有进程和线程,python中调用了操作系统的线程和进程.
一个应用程序(软件),可以有多个进程(默认只有一个),一个进程中可以创建多个线程(默认一个).
创建进程是为了提供环境让线程工作,进程和进程之间做数据隔离(java/c#)
创建线程是因为线程是cpu工作的最小单元,创建线程可以利用多核优势实现并行操作(java/c#)
而python中存在一个GIL锁造成多线程无法利用多核优势,只能开多进程处理(浪费资源)
查看GIL切换的指令(sys.getcheckinterval)
Python语言的创始人在开发这门语言时,目的是快速把语言开发出来,如果加上GIL锁(C语言加锁),切换时按照100条字节指令来进行线程间的切换。
二. python进程,线程和java,c#的区别
python多线程情况下:
计算密集型操作:效率低(GIL锁)
IO操作:效率高
python多进程的情况下:
计算密集型操作:效率高(浪费资源)不得已而为之.
IO操作:效率高(浪费资源)
写python时IO密集型用多线程,计算密集型用多进程
java,c#多线程情况下:
计算密集型操作:效率高
IO操作:效率高
java,c#多进程的情况下:
计算密集型操作:效率高(浪费资源)
IO操作:效率高(浪费资源)
三. 线程的一些参数
start 线程准备就绪等待CPU调度
setDaemon 主线程不再等,主线程终止则所有子线程终止
join 无参数,让主线程在这里等着,等到设置join的子线程执行完毕,才可以继续往下走.
join 有参数,让主线程在这里最多等待n秒,无论是否执行完毕,会继续往下走
threading.current_thread() 获取当前执行该函数的线程的对象
getName 根据当前线程对象获取当前线程名称
setName 给当前线程对象设置名称
四.多线程方式
多线程方式:1
def func(arg): print(arg) t1 = threading.Thread(target=func,args=(11,)) t1.start()
多线程方式:2
class MyThread(threading.Thread): def run(self): print(123,self._args,self._kwargs) t1 = MyThread(args=(11,)) t1.start() t2 = MyThread(args=(22,)) t2.start()
五.线程补充
1.线程安全
在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况.
2.锁
1.lock = threading.Lock()
lock.acquire()
lock.release()
2.lock = threading.Rlock()
lock.acquire()
lock.acquire()
lock.release()
lock.release()
可以多次锁
3.lock = threading.BoundeSemaphore(N)
N个N个的取
4.lock = threading.Condition()
lock.acquire()
lock.wait()
lock.release()
lock.acquire()
lock.notify()#触发条件
lock.release()
5.锁Event
lock.wait()加锁
lock.set()绿灯
lock.clear()再次变红灯
lock.set()再次变绿灯
6.threading.local()内部会为当前线程创建一个空间用于存储
7.线程池
from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor()
pool.submit()
8.生产者消费者模型
q = queue.Queue()
q.put()
q.get()
六.进程补充
1.线程数据共享(两种)
1.q = multiprocessing.Queue()
q.put
q.get
2.m = multiprocessing.Manager()
dic = m.dict()
2.进程锁
和线程锁一样
3.进程池
from concurrent.futures import ThreadPoolExecutor
pool = ThreadPoolExecutor()
pool.submit()
来源:https://www.cnblogs.com/nianshaoyouwei/p/9628670.html