zoukankan      html  css  js  c++  java
  • 线程与进程

    线程是应用程序中的最小单元,即操作系统能够进行运算调度的最小单位,它包含在进程中,是进程中的实际运作单位,

    一条线程指的是在进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务

    每个进程至少包括一个线程,线程间的数据是共享的,每个进程也可生成多个子进程,子进程间的数据默认不共享

    很多人一提到python多线程,就想到了GLI(global interpreter lock)全局解释锁,无论你启用多少线程,python在执行时,每次同一时刻,只允许一个线程执行任务,但是这个特性仅仅只是cpython解释器带来的,python这门语言设计并不是依赖于GLI运行的,比如Jpython,使用的是JLI,就不存在这个问题,

    线程与进程区别

    1.线程在进程之间是共享内存地址空间的,是通过进程创建的;进程拥有它自己的独立空间

    2.线程直接访问它进程的数据块;进程是将父进程中数据再复制出一份使用

    3.进程中的线程间是可以直接通信的;子进程与父进程间无非直接通信,但可以通过队列管道相互交流数据

    4.一个新的线程创建很容易;一个新的进程创建需要从父进程里重新拷贝父进程的所有数据,耗费资源

    5.在进程中的多线程间可以控制其他线程;进程只能控制它的子进程

    6.改变主线程优先级会影响线程的在进程中的行为,改变父进程不会影响子进程,

    复制代码
     1 import threading
     2 import time
     3 
     4 
     5 def say(msg):
     6     print("say :{}".format(msg))
     7     time.sleep(2)
     8 
     9 t = threading.Thread(target=say, args=(1,))  # 函数不能加括号,参数必须用逗号分隔
    10 t.start()
    11 
    12 print("over ???")  # 程序并未在运行到这段代码时结束
    13 
    14 
    15 def say(msg):
    16     print("say :{}".format(msg))
    17     time.sleep(2)
    18 
    19 t = threading.Thread(target=say, args=(1,))
    20 t.start()
    21 t.join()
    22 
    23 print("game over")  # 通过join实现wait方式,最终执行完这段代码就结束了
    复制代码

    通过类方式创建线程

    复制代码
     1 class MyThread(threading.Thread):
     2     def __init__(self, msg):
     3         threading.Thread.__init__(self)  # 经典类继承
     4         # super(MyThread, self).__init__(self)
     5         self.msg = msg
     6 
     7     def run(self):  # 必须在类中实现一个这个RUN方法,为线程start调用
     8         time.sleep(2)
     9         print(self.msg)
    10 
    11 t = MyThread('hello')
    12 t.start()
    13 
    14 
    15 for i in range(10):
    16     t = threading.Thread(target=say, args=(i,))
    17     t.start()
    18 
    19 print("程序执行到这,未结束")
    20 
    21 
    22 t_list = []  # 创建一个空列表,将线程实例加入进去
    23 for i in range(10):
    24     t = threading.Thread(target=say, args=(i,))
    25     t_list.append(t)
    26     t.start()
    27     print(t.getName())  # 获取线程名
    28 
    29 
    30 for i in t_list:
    31     i.join()
    32 
    33 print("程序执行到这,结束了")

    复制代码

    线程锁

    复制代码
     1 #线程锁
     2 num = 100
     3 lock = threading.Lock()
     4 
     5 
     6 def addNum():
     7     global num
     8     print("get num {}".format(num))
     9     time.sleep(2)  # 如果锁加在这,程序将等待200秒
    10     lock.acquire()  # 加上锁,实际上变成串行运行
    11     num -= 1
    12     lock.release()  # 释放锁
    13 
    14 t_list = []
    15 
    16 for i in range(100):
    17     t = threading.Thread(target=addNum)
    18     t.start()
    19     t_list.append(t)
    20 
    21 
    22 for i in t_list:
    23     i.join()  # 阻塞,等待
    24 
    25 print("程序运行结束,num = [{}]".format(num))
    复制代码

    红绿灯实例

    复制代码
     1 #红绿灯
     2 event = threading.Event()
     3 def car(n):
     4     while True:
     5         time.sleep(1)
     6         if event.isSet():  # 绿灯
     7             print("car [%s] is running.." % n)
     8         else:
     9             print("car [%s] is waiting for the red light..." % n)
    10             event.wait()
    11 
    12 def light():
    13     if not event.isSet():
    14         event.set()  # wait 就不阻塞, # 绿灯状态
    15     count = 0
    16     while True:
    17         if count < 10:
    18             print("33[42;1m---green light on ---33[0m")
    19         elif count < 13:
    20             print("33[43;1m---yellow light on ---33[0m")
    21         elif count < 20:
    22             if event.isSet():
    23                 event.clear()
    24             print("33[41;1m---red light on ---33[0m")
    25         else:
    26             count = 0
    27             event.set()  # 打开绿灯
    28         time.sleep(1)
    29         count += 1
    30 
    31 if __name__ == "__main__":
    32     event = threading.Event()
    33     Light = threading.Thread(target=light)
    34     Light.start()
    35 
    36     for i in range(3):
    37         t = threading.Thread(target=car, args=(i,))
    38         t.start()
    复制代码
    复制代码
     1 #!/usr/bin/env python3
     2 # -*- coding: utf-8 -*-
     3 """
     4 @author: zengchunyun
     5 """
     6 import threading
     7 import time
     8 
     9 
    10 def show(i):
    11     print("[{:^100}]".format("doubi"))
    12     time.sleep(22)
    13     print(i)
    14 
    15 t = threading.Thread(target=show, args=(1,))
    16 t.start()
    17 t.join(11)  # 设置join,等待线程执行完毕才继续,如果设置超时时间.则在这个时间内,如果线程未执行完毕,则不继续等待,执行后面的代码
    18 # , 如果后面的代码执行完毕,线程还未执行完成,依旧等待线程执行
    19 print(123)
    复制代码
  • 相关阅读:
    Software Solutions CACHE COHERENCE AND THE MESI PROTOCOL
    CACHE COHERENCE AND THE MESI PROTOCOL
    Multiprocessor Operating System Design Considerations SYMMETRIC MULTIPROCESSORS
    Organization SYMMETRIC MULTIPROCESSORS
    PARALLEL PROCESSING
    1分钟内发送差评邮件
    Secure Digital
    SYMMETRIC MULTIPROCESSORS
    A Taxonomy of Parallel Processor Architectures
    parallelism
  • 原文地址:https://www.cnblogs.com/dusihan/p/10131321.html
Copyright © 2011-2022 走看看