python协成_Python协程

今天给大家介绍一下协程。

协程存在于线程之中,线程默认不会等待协程执行

协程使用的库是gevent

spawn:开启协程(第一个参数为协程要执行的任务)

join: 让线程等待协程执行

协程之间切换的条件:gevent.sleep() 协程耗时等待的情况下才会切换

协程只能并发不能做并行

import gevent

from gevent import monkey

import time

a = monkey.patch_all()

def work_1():

for i in range(10):

print("work1---{}".format(i))

# gevent.sleep(1) # 协程耗时等待的情况下才会切换

time.sleep(0.1)

# gevent 的程序补丁 只要代码中有耗时的操作就会进行一个切换

monkey.patch_all()

def work_2():

for i in range(10):

print("work2---{}".format(i))

# gevent.sleep(1) # 协程耗时等待的情况下才会切换

time.sleep(0.1)

monkey.patch_all()

# 创建两个协程

g1 = gevent.spawn(work_1)

g2 = gevent.spawn(work_2)

g1.join() # 让线程等待协程执行

g2.join() # 让线程等待协程执行

下面附上一段代码,使用协程访问一个网站,利用队列加入访问的url地址,使用协程取出并访问

importrequests

importgevent

from gevent importmonkey

importqueue

importtime

count =0

q =queue.Queue()

for i in range(1000):

q.put('http://localhost:3000/login')

defget():

globalcount

while q.qsize() >0:

requests.get(url=q.get())

if q.qsize() ==0:

breakmonkey.patch_all()

# count += 1

# print(count)

s =time.time()

g1 =gevent.spawn(get)

g2 =gevent.spawn(get)

g1.join()

g2.join()

e =time.time()

print(e - s)

前面有讲到进程、线程,今天又讲到了协程,那么该怎么结合使用呢

from threading importThread

from multiprocessing importProcess, Queue

importgevent

importrequests

defwork():

q =Queue()

for i in range(10000):

q.put('http://localhost:3000/')

print('{}个任务'.format(q.qsize()))

pro_list =[]

for i in range(2):

# 创建2个进程 进程的工作函数process_work

p = Process(target=process_work, args=(q,))

p.start()

pro_list.append(p)

for p inpro_list:

p.join()

defprocess_work(q):

'''

:paran: q:进程中通讯的任务队列

'''

thread_list =[]

# 在每一个进程中创建3个线程

for i in range(3):

# 线程的工作函数 thread_work

t = Thread(target=thread_work, args=(q,))

thread_list.append(t)

t.start()

for t inthread_list:

t.join()

defthread_work(q):

g_list =[]

# 在每一个线程中创建5个协程

for i in range(5):

t =gevent.spawn(green_work, q, )

g_list.append(t)

gevent.joinall(g_list)

defgreen_work(q):

count =0

# 判断队列内是否有值

while notq.empty():

# 设置超时等待时间

requests.get(url=q.get(0.01))

# 设置强制等待切换协程

gevent.sleep(0.001)

count += 1

print('协程执行了{}个任务'.format(count))

if __name__ == '__main__':

work()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值