进程:
进程就是一段程序的执行过程。
线程:
通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。
多线程:
在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。线程是在同一时间需要完成多项任务的时候实现的。
最简单的比喻多线程就像火车的每一节车厢,而进程则是火车。车厢离开火车是无法跑动的,同理火车也不可能只有一节车厢。多线程的出现就是为了提高效率。
线程和进程的关系区别:
1 一个程序至少有一个进程,一个进程至少有一个线程.(进程可以理解成线程的容器)
2 进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
3 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和
程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
4 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调
度的一个独立单位.
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程
自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈)但是
它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.
问:进程快还是线程快?
进程和线程没有可比性。进程是资源的集合,线程是真正执行任务的,进程想执行任务也得通过线程。所以问进程快还是线程快 其实问的是两个线程哪个快。
在用c语言编写的python中有一个设计缺陷
不管 计算机cpu有几核 但在cpython中同一时间只会执行一个线程.
python的线程与threading模块
threading 模块建立在thread 模块之上。thread模块以低级、原始的方式来处理和控制线程,而threading 模块通过对thread进行二次封装,提供了更方便的api来处理线程。
-----------练习---------------
案例:
import threading import time class MyThread(threading.Thread): def __init__(self,name): threading.Thread.__init__(self) self.name=name def run(self): for i in range(1, 100): time.sleep(0.1) print(self.name + "run.........") #def start(self): # super().start() mythread = MyThread("t1") mythread2 = MyThread("t2") mythread.start() mythread2.start()
案例:2 伙夫和和尚
import threading import time list1 = [] class Huofu(threading.Thread): def __init__(self, name): threading.Thread.__init__(self) self.name = name def run(self): while True: cond2.acquire() for i in range(1, 11): time.sleep(1) list1.append(i) print(i) cond2.acquire() cond2.notify_all() cond2.release() cond1.acquire() cond1.wait() cond1.release() class Heshang(threading.Thread): def __init__(self, name): threading.Thread.__init__(self) self.name = name def run(self): while True: cond2.acquire() if len(list1)==0: cond1.acquire() cond1.notify_all() cond1.release() cond2.wait() else: mantou=list.pop() print("{0}在吃第{1}个馒头".format(self.name,mantou)) time.sleep(1) cond2.release() # if mantou!=None: # print("{0}在吃第{1}个馒头".format(self.name, mantou)) lock1 = threading.Lock() cond1 = threading.Condition(lock=lock1) lock2 = threading.Lock() cond2 = threading.Condition(lock=lock2) Huofu('做饭和尚').start() Heshang('吃饭和尚1').start() Heshang('吃饭和尚2').start() Heshang('吃饭和尚3').start()