码迷,mamicode.com
首页 > 编程语言 > 详细

11 线程进程协程

时间:2016-07-18 02:47:21      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:

1 线程

1.1 基本应用

1.1.1 标准线程(常用)

import threading
def f1(arg):
    print(arg)

t = threading.Thread(target=f1, args=(123,))
t.start()

1.1.2 自定义线程

自定义线程类既threading.Thread流程,自定义run方法

import threading
class MyThread(threading.Thread):  #自定义类,继承threading.Thread类
    def __init__(self, func, args):
        self.func = func
        self.args = args
        super(MyThread, self).__init__()

    def run(self):  #定义run方法
        self.func(self.args)
def f2(arg):
    print(arg)

obj = MyThread(f2, 123)
obj.start()

1.2 队列queue

1.2.1 队列类型

  • queue.Queue先进先出队列
  • queue.LifoQueue后进先出队列
  • queue.PriorityQueue优先级队列
  • queue.deque双向队列

1.2.2 queue.Queue先进先出队列

参数

put放数据(默认阻塞),是否阻塞,阻塞时的超时时间

get取数据(默认阻塞),是否阻塞,阻塞时的超时时间

queue.Queue(n),n队列最大长度

empty() #检查队列是否为空

qsize() #真实个数

maxsize()  #最大支持的个数

join()  #队列中的任务全部完成之后(元素没有被完成(取出))

task_done()  #结束取值任务

import queue

q = queue.Queue(3)  # 定义队列,最多可放10个数据
q.put(11)  # put存放数据
q.put(22)
q.put(33,block=False, timeout=2)  # 默认block阻塞,timeout超时时间

print(q.qsize())  # 真实数据个数
print(q.empty())  #查看队列是否为空
print(q.get())
q.task_done()  #结束取值任务
print(q.get())
q.task_done()  #结束取值任务
print(q.get(block=False, timeout=2)) # 默认block阻塞,timeout超时时间
q.task_done()  #结束取值任务
print(q.empty())  #查看队列是否为空
q.join()  # 阻塞进程,当队列中任务执行完毕后不再阻塞,与task_done()配合使用

1.2.3 后进先出队列

q = queue.LifoQueue()
q.put(123)
q.put(456)
q.put(789)
print(q.get())

# 789
# 456
# 123

1.2.4 优先级队列

q = queue.PriorityQueue()
q.put((1, "alex4"))
q.put((1, "alex3"))
q.put((2, "alex2"))
q.put((0, "alex0"))
q.put((1, "alex1"))
print(q.get())
print(q.get())
print(q.get())
print(q.get())

# (0, ‘alex0‘)
# (1, ‘alex1‘)
# (1, ‘alex3‘)
# (1, ‘alex4‘) 

PS:如果优先级ID相同,按参数排序 

1.2.5 双向队列

q = queue.deque()
q.append(123)
q.append(456)
q.appendleft(789)
print(q.pop())
print(q.popleft())

# 456
# 789

1.3 生产者消费者模型(队列的应用)

import queue
import threading
import time

q = queue.Queue()

def productor(arg):
    """
    买票
    :param arg:
    :return:
    """
    q.put(str(arg)+ ‘票‘)


for i in range(300):
    t = threading.Thread(target=productor, args=(i, ))
    t.start()


def consumer(arg):
    """
    服务器后台
    :param arg:
    :return:
    """
    while True:
        print(arg, q.get())
        time.sleep(2)

for j in range(3):
    t = threading.Thread(target=consumer, args=(j, ))
    t.start()

  

1.4 线程锁(Lock,RLock)

1.5 信号量()

1.6 事件(event)

1.7 条件(Condition)

1.8 Timer

1.9 线程池

第2章 进程

2.1 基本使用

2.2 进程数据共享

2.2.1 queues(队列)数据共享

2.2.2 array(数组)

2.2.3 Manager.dict(字典)

2.3 进程锁

2.4 进程池

2.5 小结

第3章 协程

3.1 greenlet

3.2 gevent

3.3 Windows安装gevent

import queue

q = queue.Queue(3# 定义队列,最多可放10个数据
q.put(11# put存放数据
q.put(22)
q.put(
33,block=False, timeout=2# 默认block阻塞,timeout超时时间

print(q.qsize())  # 真实数据个数
print(q.empty())  #查看队列是否为空
print(q.get())
q.task_done() 
#结束取值任务
print(q.get())
q.task_done() 
#结束取值任务
print(q.get(block=False, timeout=2)) # 默认block阻塞,timeout超时时间
q.task_done()  #结束取值任务
print(q.empty())  #查看队列是否为空
q.join()  # 阻塞进程,当队列中任务执行完毕后不再阻塞,与task_done()配合使用

11 线程进程协程

标签:

原文地址:http://www.cnblogs.com/liangdalong/p/5679776.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!