Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的并行性不是';不正常工作_Python_Multithreading_Google App Engine_Python 2.7_Python Multithreading - Fatal编程技术网

python中的并行性不是';不正常工作

python中的并行性不是';不正常工作,python,multithreading,google-app-engine,python-2.7,python-multithreading,Python,Multithreading,Google App Engine,Python 2.7,Python Multithreading,我用python 2.7在gae上开发了一个应用程序,一个ajax调用从API请求一些数据,一个请求可能需要约200毫秒,但是当我打开两个浏览器并在很近的时间内发出两个请求时,它们需要的时间比这个时间的两倍还多,我尝试过将所有内容都放在线程中,但都不起作用。。(当应用程序在线时会发生这种情况,而不仅仅是在dev服务器上) 因此,我编写了这个简单的测试,看看这在python中是否是一个问题(在繁忙等待的情况下),下面是代码和结果: def work(): t = datetime.now(

我用python 2.7在gae上开发了一个应用程序,一个ajax调用从API请求一些数据,一个请求可能需要约200毫秒,但是当我打开两个浏览器并在很近的时间内发出两个请求时,它们需要的时间比这个时间的两倍还多,我尝试过将所有内容都放在线程中,但都不起作用。。(当应用程序在线时会发生这种情况,而不仅仅是在dev服务器上)

因此,我编写了这个简单的测试,看看这在python中是否是一个问题(在繁忙等待的情况下),下面是代码和结果:

def work():
    t = datetime.now()
    print threading.currentThread(), t
    i = 0
    while i < 100000000:
        i+=1
    t2 = datetime.now()
    print threading.currentThread(), t2, t2-t

if __name__ == '__main__': 
    print "single threaded:"
    t1 = threading.Thread(target=work)
    t1.start()
    t1.join()

    print "multi threaded:"
    t1 = threading.Thread(target=work)
    t1.start()
    t2 = threading.Thread(target=work)
    t2.start()
    t1.join()
    t2.join()
def work():
t=datetime.now()
打印threading.currentThread(),t
i=0
当我<100000000时:
i+=1
t2=datetime.now()
打印线程.currentThread(),t2,t2-t
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
打印“单线程”:
t1=线程。线程(目标=工作)
t1.start()
t1.join()
打印“多线程”:
t1=线程。线程(目标=工作)
t1.start()
t2=线程。线程(目标=工作)
t2.start()
t1.join()
t2.join()
mac os x、core i7(4核、8线程)、python2.7上的结果:

single threaded:
<Thread(Thread-1, started 4315942912)> 2011-12-06 15:38:07.763146
<Thread(Thread-1, started 4315942912)> 2011-12-06 15:38:13.091614 0:00:05.328468

multi threaded:
<Thread(Thread-2, started 4315942912)> 2011-12-06 15:38:13.091952
<Thread(Thread-3, started 4323282944)> 2011-12-06 15:38:13.102250
<Thread(Thread-3, started 4323282944)> 2011-12-06 15:38:29.221050 0:00:16.118800
<Thread(Thread-2, started 4315942912)> 2011-12-06 15:38:29.237512 0:00:16.145560
单线程:
2011-12-06 15:38:07.763146
2011-12-06 15:38:13.091614 0:00:05.328468
多线程:
2011-12-06 15:38:13.091952
2011-12-06 15:38:13.102250
2011-12-06 15:38:29.221050 0:00:16.118800
2011-12-06 15:38:29.237512 0:00:16.145560
这太令人震惊了!!如果单个线程需要5秒来完成此操作。。我原以为同时启动两个线程将需要相同的时间来完成这两项任务,但这几乎需要三倍的时间。。这使得整个线程的想法毫无用处,因为按顺序执行会更快


这里我缺少什么..

CPython解释器将不允许运行多个线程。了解吉尔

因此,某些任务不能在CPython中通过线程以有效的方式并发完成

如果您想在GAE中并行处理一些事情,那么就用单独的请求并行地启动它们


此外,您可能希望参考Python并行wiki,我将了解时间的走向。例如,假设服务器每200ms只能回答一个查询。那么你就无能为力了,每200毫秒只会收到一封回复,因为这是服务器所能提供给你的。

关于这个问题,请参加PyCon 2010。 正如其他人已经指出的,对于某些任务,使用线程(尤其是多核线程)可能会导致比单线程执行相同任务的性能更低。比兹利发现,问题与多个磁芯具有以下特性有关:

为了避免GIL争用,让任务在单独的进程而不是单独的线程中运行可能会获得更好的结果。该模块提供了一种方便的方法,特别是因为多处理API与线程API非常相似

import multiprocessing as mp
import datetime as dt
def work():
    t = dt.datetime.now()
    print mp.current_process().name, t
    i = 0
    while i < 100000000:
        i+=1
    t2 = dt.datetime.now()
    print mp.current_process().name, t2, t2-t

if __name__ == '__main__': 
    print "single process:"
    t1 = mp.Process(target=work)
    t1.start()
    t1.join()

    print "multi process:"
    t1 = mp.Process(target=work)
    t1.start()
    t2 = mp.Process(target=work)
    t2.start()
    t1.join()
    t2.join()

另外,正如zeekay在评论中指出的那样,GIL之战只对CPU受限的任务严重。这对于IO绑定的任务来说应该不是问题

你读过Python中的全局解释器锁(GIL)吗?如果您想要并行处理,您应该考虑多处理,而不是线程。一次只能执行一个线程,除非您使用的库是专门为发布GIL而设计的。您的基准测试设计得很糟糕。您的实际用例将是IO绑定的,而不是CPU绑定的。Python的GIL在每种情况下的行为都非常不同。在您的实际用例中,线程应该可以正常工作。@g.d.d.c.多处理在中不可用GAE@bpgergoMohamed,你看到的另一个问题是,AppEngine dev_appserver是单线程的,所以多个请求是按顺序执行的。生产中并非如此。不要期望dev_appserver上的性能指标能够代表生产行为。这种行为是Python特有的吗?如果是这样,为什么?GIL是Python特有的,所以“GIL战斗”是GIL特有的。我不确定在其他语言中是否会发生类似的事情。看看他的代码。他正在呼叫
datetime
,没有与服务器通信。
single process:
Process-1 2011-12-06 12:34:20.611526
Process-1 2011-12-06 12:34:28.494831 0:00:07.883305
multi process:
Process-3 2011-12-06 12:34:28.497895
Process-2 2011-12-06 12:34:28.503433
Process-2 2011-12-06 12:34:36.458354 0:00:07.954921
Process-3 2011-12-06 12:34:36.546656 0:00:08.048761