zoukankan      html  css  js  c++  java
  • 线程池,协程

    线程的其他方法: 

      Threading.current_thread() #当前线程对象
      GetName() 获取线程名
      Ident 获取线程id
      Threading.Enumerate() #当前正在运行的线程对象的一个列表
      Threading.active_count() #当前正在运行的线程数量

      

     1 import time
     2 import threading
     3 from threading import Thread,current_thread
     4 def fn(n):
     5     time.sleep(1)
     6     print('子线程名称:',current_thread().getName())
     7     print('%s线程任务'%n)
     8 def f2(n):
     9     time.sleep(1)
    10     print('子线程名称:',current_thread().getName())
    11     print('%s线程任务'%n)
    12 if __name__ == '__main__':
    13     t1 = Thread(target=fn,args=(1,))
    14     t2 = Thread(target=f2,args=(2,))
    15     t1.start()
    16     t2.start()
    17     print('主线程名称:',current_thread().getName())
    18     print('主线程ID:',current_thread().ident)
    19     print(current_thread())
    20     print(threading.enumerate())
    21     print(threading.active_count())

    线程队列:

    种类:
      Import queue
      先进先出队列:queue.Queue(3)
      先进后出后进先出队列:queue.LifoQueue(3)
      优先级队列:queue.priorityQueue(3)   Put的数据是一个元组,元组的第一个参数是优先级数字,数字越小优先级越高,
                        越先被get到被取出来,第二个参数是put进去的值,如果说优先级相同,那么值别忘了
                        应该是相同的数据类型,字典不行

    方法:
      q.put() 进
      q.put_nowait()不阻塞的进,超出队列长度会报错 Exception
      q.qsize() 查看当前队列长度
      q.full() 查看当前队列是否满了,返回True或返回False

      q.get() 取
      q.get_nowait() 不阻塞的取,超出队列长度会报错 Exception
      q.empty() 查看当前队列是否空了,返回True或返回False

     1 import queue
     2 q = queue.Queue(4)
     3 q.put(1)
     4 q.put(2)
     5 q.put(3)
     6 print(q.qsize())
     7 q.put(4)
     8 print(q.full())
     9 try:
    10     q.put_nowait(1)
    11 except Exception:
    12     print('队列满了')
    13 print(q.get())
    14 print(q.get())
    15 print(q.get())
    16 print(q.get())
    17 print(q.empty())
    18 try:
    19     q.get_nowait()
    20 except Exception:
    21     print('队列空了')
    22 
    23 import queue
    24 q = queue.LifoQueue(4)
    25 q.put(1)
    26 q.put(2)
    27 q.put(3)
    28 q.put(4)
    29 print(q.get())
    30 print(q.get())
    31 print(q.get())
    32 print(q.get())
    33 
    34 import queue
    35 q = queue.PriorityQueue(3)
    36 q.put((3,'123'))
    37 q.put((5,[1,2,3]))
    38 q.put((8,(1,2,3,)))
    39 print(q.get())
    40 print(q.get())
    41 print(q.get())

    线程池:

      submit #异步提交任务
      result #和get方法一样,如果没有结果,会等待,阻塞程序
      shutdown #主线程等待所有提交给线程池的任务,全部执行完毕 close + join

    
    
    import time,threading,gevent
    from gevent import monkey;monkey.patch_all()
    def f1():
    print('第一次f1')
    print(threading.current_thread().getName())
    gevent.sleep(1)
    time.sleep(1)
    print('第二次f1')
    def f2():
    print('第一次f2')
    print(threading.current_thread().getName())
    gevent.sleep(1)
    time.sleep(2)
    print('第二次f2')
    s = time.time()
    g1 = gevent.spawn(f1) #异步提交任务
    g2 = gevent.spawn(f2)
    gevent.joinall([g1,g2]) #相当于g1 跟 g2 都执行了join方法
    e = time.time()
    print('执行时间:',e-s)
    print('主程序结束')
     

    线程池回调函数: from conncurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor

    1 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
    2 def f1(n,s):
    3     return n + s
    4 def f2(n):
    5     print('回调函数>>>',n.result())
    6 if __name__ == '__main__':
    7     t = ThreadPoolExecutor(4)  #这里可以更改为ProcessPoolExecutor使用
    8     res = t.submit(f1,11,12).add_done_callback(f2)   #将f1中的值回调给f2    

    多线程实现socket

     1 #服务端
     2 import threading
     3 import socket
     4 server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     5 server.bind(('127.0.0.1',8080))
     6 server.listen(5)
     7 def action(conn):
     8     while True:
     9         data=conn.recv(1024)
    10         print(data.decode('utf-8'))
    11         msg = input('服务端输入:') #在多线程里面可以使用input输入内容,那么就可以实现客户端和服务端的聊天了,多进程不能输入
    12         conn.send(msg.encode('utf-8'))
    13 
    14 if __name__ == '__main__':
    15 
    16     while True:
    17         conn,addr=server.accept()
    18         p=threading.Thread(target=action,args=(conn,))
    19         p.start()
     1 #客户端
     2 import socket
     3 client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
     4 client.connect(('127.0.0.1',8080))
     5 while True:
     6     msg=input('>>: ').strip()
     7     if not msg:continue
     8 
     9     client.send(msg.encode('utf-8'))
    10     data=client.recv(1024)
    11     print(data.decode('utf-8'))
  • 相关阅读:
    子类继承和调用父类的构造方法 (转)
    数组复制 System.arraycopy 与 Arrays.copyof()
    ArrayList的使用方法 (转)
    Eclipse 的debug 用法 (转)
    for each
    二维数组 排序 随机数 练习
    react 之 reflux 填坑
    react & vue 项目创建的方式
    数组实例的 copyWithin()
    es6的正则扩展笔记之修饰符
  • 原文地址:https://www.cnblogs.com/Godisgirl/p/10269246.html
Copyright © 2011-2022 走看看