zoukankan      html  css  js  c++  java
  • Python学习 14day__高级语法

    线程替代方案

      subprocess
       完全跳过线程,使用进程
       是派生进程的主要替代方案
      multiprocessiong
       使用threading接口派生,使用紫子进程
      concurrent.futures
       新的异步执行模块
       任务级别的操作

    多进程

      进程间通讯
      进程间无任何共享状态

     1 # 进程的创建
     2 import multiprocessing
     3 from time import sleep,ctime
     4 
     5 def clock(interval):
     6     while True:
     7         print("The time is %s"%ctime())
     8         sleep(interval)
     9 
    10 if __name__ == '__main__':
    11     p = multiprocessing.Process(target= clock, args = (5,))
    12     p.start()
    13 
    14     while True:
    15         print("sleeping.....")
    16         sleep(1)
     1         import multiprocessing
     2         from time import sleep, ctime
     3 
     4 
     5         class ClockProcess(multiprocessing.Process):
     6             """
     7             两个函数比较重要
     8              init构造函数
     9              run
    10             """
    11 
    12             def __init__(self, interval):
    13                 super().__init__()
    14                 self.interval = interval
    15 
    16             def run(self):
    17                 while True:
    18                     print("The time is %s" % ctime())
    19                     sleep(self.interval)
    20 
    21 
    22         if __name__ == '__main__':
    23             p = ClockProcess(3)
    24             p.start()
    25 
    26             while True:
    27                 print("sleeping.....")
    28                 sleep(1)

    派生子类
     1 import multiprocessing
     2 from time import sleep, ctime
     3 
     4 class ClockProcess(multiprocessing.Process):
     5     """
     6     两个函数比较重要
     7      init构造函数
     8      run
     9     """
    10 
    11     def __init__(self, interval):
    12         super().__init__()
    13         self.interval = interval
    14 
    15     def run(self):
    16         while True:
    17             print("The time is %s"% ctime())
    18             sleep(self.interval)
    19 
    20 if __name__ == '__main__':
    21     p = ClockProcess(3)
    22     p.start()
    23 
    24     while True:
    25         print("sleeping.....")
    26         sleep(1)

      在os中查看pid, ppid以及他们的关系

     1 from multiprocessing import Process
     2 import os
     3 
     4 def info(title):
     5     print(title)
     6     print("module name:", __name__)
     7     # 得到父类进程的id
     8     print("parent process:", os.getppid())
     9     # 得到本身进程的id
    10     print("process id:", os.getpid())
    11 
    12 
    13 def f(name):
    14     info('function f')
    15     print('hello', name)
    16 
    17 if __name__ == '__main__':
    18     info("main line")
    19     p = Process(target=f, args=("bob",))
    20     p.start()
    21     p.join()

    迭代器

      可迭代(Iterable):直接作用于for循环变量
      迭代器(Iterator): 不但可以作用于for循环,还可以被next调用
      list是可迭代对象,但不是迭代器

    1 l = [i for i in range (5)]
    2 #l 是可迭代对象,但不是迭代器
    3 for x in l:
    4     print(x)
    5 # range 是迭代器
    6 for i in range(5):
    7     print(i)

    通过isintance判断
    1 from collections import Iterable
    2 
    3 ll = [1, 2, 3, 4, 5]
    4 print(isinstance(ll, Iterable))  # 判断ll是否可迭代
    5 
    6 from collections import Iterator
    7 print(isinstance(ll, Iterator))  # 判断ll是否为迭代器

    通过iter()函数可以将Iterable和Iterator进行转换
    1 s = 'I Love Python'
    2 
    3 print(isinstance(s, Iterable))
    4 print(isinstance(s, Iterator))
    5 
    6 s_iter = iter(s)                #  通过iter()函数将s变为迭代器
    7 print(isinstance(s_iter, Iterable))
    8 print(isinstance(s_iter, Iterator))

    生成器

      generator: 一边循环一边计算下一个元素的机制/算法
      需要满足三个条件:
       每次调用都生产出for循环需要的下一个元素
       如果达到左后一个后,爆出StopIteration异常
       可以被next调用

    直接使用生成器
    1 L = [x*x for x in range(5)] # 放在中括号里面是列表生成式
    2 l = (x*x for x in range(5)) # 放在小括号中就是生成器
    3 
    4 print(type(L))
    5 print(type(l))


    在函数odd中,yield负责返回
     1 def odd():
     2     print("Step 1")
     3     yield 1
     4     print("Step 2")
     5     yield 1
     6     print("Step 3")
     7     yield 1
     8 
     9 # odd()是调用生成器
    10 g = odd()
    11 one = next(g)
    12 print(one)
    13 two = next(g)
    14 print(two)


    # for循环调用生成器
    # 斐波那契数列的生成器写法
     1 def fib(max):
     2     n, a, b = 0, 0, 1
     3     while n < max:
     4         yield b
     5         a, b = b, a+b
     6         n += 1
     7     return 'Done'
     8 
     9 g = fib(5)
    10 for i in range(6):
    11     rst = next(g)
    12     print(rst)

    协程

      协程是为非抢占式多任务产生子程序的计算机程序组件,协程允许不同入口点在不同位置暂停或开始执行程序
      协程的四个状态:
       GEN_CREATED: 等待开始执行
       GEN_RUNNING: 解释器正在执行
       GEN_SUSPENED: 在yield表达式处暂停
       GEN_CLOSED: 执行结束

     1 # 协程代码1
     2 def simple_coroutine():
     3     print("——> strat")
     4     x = yield
     5     print("——> recived", x)
     6 
     7 # 主线程
     8 sc = simple_coroutine()
     9 print(1111)
    10 # 可以使用sc.send(None)
    11 next(sc)           # 执行一次在yield处终止
    12 
    13 print(2222)
    14 sc.send("zhexiao")
  • 相关阅读:
    Xml 映射文件中,除了常见的 select|insert|updae|delete 标签之外,还有哪些标签?
    zookeeper 是如何保证事务的顺序一致性的?
    什么是 Callable 和 Future?
    MyBatis 实现一对一有几种方式?具体怎么操作的?
    Zookeeper 对节点的 watch监听通知是永久的吗?为什么 不是永久的?
    合同测试你懂什么?
    查看各类环境变量用什么命令?
    我们如何进行跨功能测试?
    怎么查看系统支持的所有信号?
    Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?
  • 原文地址:https://www.cnblogs.com/Burtit/p/9438614.html
Copyright © 2011-2022 走看看