协程

协程实现多任务的几种方式(需要使用的协程解决问题的时候,建议用 gevent)

1. yield

import time

def task1():
	print("---1---")
	time.sleep(0.1)
	yield
	

def task2():
	print("---2---")
	time.sleep(0.1)
	yield
	
def main():
	t1 = task1()
	t2 = task2()
	while True:
		next(t1)
		next(t2)
		
if __name__ == "__main__":
	main()

2. greenlet

from greenlet import greenlet
import time


def test1():
	while True:
		print("---A---")
		gr2.switch()
		time.sleep(0.1)

def test2():
	while True:
		print("---B---")
		gr1.switch()
		time.sleep(0.1)


gr1 = greenlet(test1)
gr2 = greenlet(test2)

gr1.switch()

3. gevent

第一种方式:

import gevent
# gevnet 中所有和时间有关的方法都不能使用普通的, 如需要将 time.sleep() 换成 gevent.sleep()

def f1(n):
    for i in range(n):
        print(gevent.getcurrent(), i)
        gevent.sleep(0.5)


def f2(n):
    for i in range(n):
        print(gevent.getcurrent(), i)
        gevent.sleep(0.5)


def f3(n):
    for i in range(n):
        print(gevent.getcurrent(), i)
        gevent.sleep(0.5)


print("---0---")
g1 = gevent.spawn(f1, 5)
print("---1---")
g2 = gevent.spawn(f2, 5)
print("---2---")
g3 = gevent.spawn(f3, 5)
print("---3---")

g1.join()
g2.join()
g3.join()

第二种方式:

import gevent
import time
from gevent import monkey

# 默认情况下,使用time.sleep()并不能达到真正的多任务,而是需要使用gevent.sleep()
# 但是这样可能会太麻烦,所以可以使用 monkey.patch_all() 这样就会自动在执行时将
# time.sleep() 转换为 gevent.sleep()

monkey.patch_all()

def f1(n):
    for i in range(n):
        print(gevent.getcurrent(), i)
        gevent.sleep(0.5)


def f2(n):
    for i in range(n):
        print(gevent.getcurrent(), i)
        gevent.sleep(0.5)


def f3(n):
    for i in range(n):
        print(gevent.getcurrent(), i)
        gevent.sleep(0.5)


print("---0---")
g1 = gevent.spawn(f1, 5)
print("---1---")
g2 = gevent.spawn(f2, 5)
print("---2---")
g3 = gevent.spawn(f3, 5)
print("---3---")

g1.join()
g2.join()
g3.join()     

第三种方式:

import gevent
from gevent import monkey
import time
monkey.patch_all()


def f(n):
    for i in range(10):
        print(gevent.getcurrent(), i)
        time.sleep(0.5)

gevent.joinall([
        gevent.spawn(f, "work1"),
        gevent.spawn(f, "work2"),
        gevent.spawn(f, "work3"),
    ])

posted on 2019-03-29 15:09  透明的洪湖里  阅读(95)  评论(0)    收藏  举报