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)
    复制代码
  • 相关阅读:
    Linux下的inode记录
    Linux中如何使用gThumb批量调整图片大小
    U盘安装Linux安装报错及解决方案
    在Mysql中如何显示所有用户?
    【转】PowerDesigner中Table视图同时显示Code和Name
    【转】正则表达式-贪婪与非贪婪匹配
    【转】程序员书籍
    Oracle 分页、取期间数据、TOP前几
    数字信封理解
    【转】C# 利用反射动态创建对象
  • 原文地址:https://www.cnblogs.com/dusihan/p/10131321.html
Copyright © 2011-2022 走看看