Re: Multi-thread query efficiency

From: 屎克螂 <q984958198@xxxxxxxxx>
To: mongodb-user <mongodb-user@xxxxxxxxxxxxxxxx>
Date: Mon, 18 Apr 2016 19:37:36 -0700 (PDT)
Why ads?
thank you  Kevin Adistambha

在 2016年4月12日星期二 UTC+8上午10:28:28,Kevin Adistambha写道:

Hello,

The reason for the threaded performance you are seeing is due to Python’s Global 
Interpreter Lock <https://wiki.python.org/moin/GlobalInterpreterLock>, 
which allows only one thread to perform a computation.

In your code, the “computation” is the line

d = list(db.app_login_logout_log.find())

where the GIL is held by the thread that is converting BSON into Python 
data structure.

The GIL is not held for IO, but since the mongod you’re connected to is 
in localhost, comparatively little time is spent doing IO.

Using the multiprocessing module allows the program to scale up a bit 
better. For example, by modifying the code a little to be:

import pymongo
import sys
import time
from multiprocessing import Process

def xx(i):
    conn = pymongo.MongoClient('localhost',27017)
    db = conn.test
    print i, 'started'
    a = time.time()
    d = list(db.test.find().limit(100000))
    print i,'finished. time:',time.time() - a

procs = [Process(target=xx, args=(i,)) for i in range(int(sys.argv[1]))]

start = time.time()
for p in procs:
    p.start()

for p in procs:
    p.join()

print 'all done: %.2f' % (time.time() - start)

The output shows better scaling vs. using threads:

$ python foo.py 1
0 started
0 finished. time: 0.338715076447
all done: 0.35
$ python foo.py 10
0 started
1 started
2 started
3 started
4 started
5 started
6 started
7 started
8 started
9 started
4 finished. time: 1.09985303879
5 finished. time: 1.10895490646
0 finished. time: 1.11398696899
8 finished. time: 1.12296009064
3 finished. time: 1.13394904137
6 finished. time: 1.13271999359
2 finished. time: 1.13802504539
9 finished. time: 1.13268995285
7 finished. time: 1.13850402832
1 finished. time: 1.15410399437
all done: 1.17

For more information, please see Thread State and the Global Interpreter 
Lock 
<https://docs.python.org/2/c-api/init.html#thread-state-and-the-global-interpreter-lock>
.

Best regards,
Kevin



-- 
You received this message because you are subscribed to the Google Groups "mongodb-user"
group.

For other MongoDB technical support options, see: https://docs.mongodb.org/manual/support/
--- 
You received this message because you are subscribed to the Google Groups "mongodb-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mongodb-user+unsubscribe@xxxxxxxxxxxxxxxx.
To post to this group, send email to mongodb-user@xxxxxxxxxxxxxxxx.
Visit this group at https://groups.google.com/group/mongodb-user.
To view this discussion on the web visit https://groups.google.com/d/msgid/mongodb-user/e0c3b052-1ae7-44dc-93a7-e8ec91096c4b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Why ads?