首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python Eventlet派生不并发执行

Python Eventlet派生不并发执行
EN

Stack Overflow用户
提问于 2016-08-09 16:51:29
回答 1查看 626关注 0票数 2

我使用eventlet编写了以下两个版本的代码。预期2个spawn_n调用将并发执行,但事实并非如此。执行是串行进行的。

代码语言:javascript
运行
复制
import eventlet
import threading
import datetime
from eventlet.green import urllib2


def hello(name):
    print eventlet.greenthread.getcurrent(), threading.current_thread()
    print datetime.datetime.now()
    print " %s hello !!" % name
    urllib2.urlopen("http://www.google.com/intl/en_ALL/images/logo.gif").read()

eventlet.spawn(hello, 'abc')
eventlet.spawn(hello, 'xyz')
eventlet.sleep(0)

O/P:<_MainThread(MainThread,启动140365670881088)>

2016-08-09 14:04:57.782866

abc你好!!

<_MainThread(MainThread,启动140365670881088)>

2016-08-09 14:05:02.929903

xyz你好!!

代码语言:javascript
运行
复制
import eventlet
import threading
import datetime
from eventlet.green import urllib2


def hello(name):
    print eventlet.greenthread.getcurrent(), threading.current_thread()
    print datetime.datetime.now()
    print " %s hello !!" % name
    urllib2.urlopen("http://www.google.com/intl/en_ALL/images/logo.gif").read()

pool = eventlet.GreenPool(size=4)
pool.spawn_n(hello, 'pqr')
pool.spawn_n(hello, 'lmn')
pool.waitall()

O/P:<_MainThread(MainThread,启动139897149990720)>

2016-08-09 14:05:25.613546

pqr你好!!

<_MainThread(MainThread,启动139897149990720)>

2016-08-09 14:05:30.699473

lmn你好!!

在这两个版本的代码中,调用都是按顺序进行的。

EN

回答 1

Stack Overflow用户

发布于 2016-08-10 17:58:26

代码语言:javascript
运行
复制
def fun(tag):
  print('{0} begin'.format(tag))
  eventlet.sleep(0.1)  # pretty much the same as running HTTP request and throwing results away
  print('{0} end'.format(tag))

t1 = time.time()
pool.spawn(fun, 'Turtle')
pool.spawn(fun, 'Achilles')
pool.waitall()
tt = time.time() - t1
print('Total time: {0:.2f}'.format(tt))

您将看到类似于以下内容的输出:

代码语言:javascript
运行
复制
Turtle begin
Achilles begin
Turtle end
Achilles end
Total time: 0.10

这表明函数的执行是在IO等待点处交错执行的(休眠),这接近于协作并发的定义。还要注意,总时间不是两个睡眠的总和,而是最大+基础设施开销(在这个合成测试中应该接近于零)。

有问题的代码无法显示这一点,因为在IO之前只有print(它不会在Eventlet中创建IO等待),在IO之后没有。所以你实际要执行的是:

代码语言:javascript
运行
复制
main: pool.waitall() begin, switch to Eventlet loop
loop: oh, there are greenthreads scheduled to run now, switch to 1
1: print this
1: print that
1: urllib... start network IO, switch to loop
loop: there is another green thread scheduled, switch to 2
2: print this
2: print that
2: urllib... start network IO, switch to Eventlet loop
loop: wait for any event that should wake greenthread,
  suppose that would be thread 1 urllib that is finished first
1: HTTP request finished, thread 1 finished, but no code to prove it
loop: wait for any event...
2: HTTP request finished, thread 2 finished
main: pool.waitall() finished
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38846147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档