简体   繁体   English

在python中使用多线程测量执行时间

[英]Measuring time of execution using multi thread in python

from flask import Flask
from flask import request
import threading
import time
from pymongo import MongoClient
import gridfs
bridgeVideoDatabase = MongoClient().bridgeVideoDatabase
fs = gridfs.GridFS(bridgeVideoDatabase)

app = Flask(__name__)

host = '10.0.0.23'
port = 8080

client = MongoClient('mongodb://localhost:27017/')
db = client.bridgeUserInformationTable



@app.route('/sendUserStringIntData',methods=['GET', 'POST'])
def getDataFromAndroid():      
    print "Entire Data:",request.form
    UserName = request.form['UserName']
    print UserName
    #insertion
    db.bridgeUsersInfo.insert({"UserName":UserName})
    #display in console
    cursor = db.bridgeUsersInfo.find()
    for document in cursor:
        print(document)
    Thread1 = threading.Thread(target=getDataFromAndroid)

    t=time.time()

    Thread1.start()
    Thread1.join()
    print'Total time for execution :',time.time()-t,'msec'
    return "User Info Saved successfully in Database :-)"


if __name__ == '__main__':
    app.run(
        host=host, port=port
        )

Above is the script for measuring time for saving data to database using python and inputing from andoid updated. 以上是用于测量使用python将数据保存到数据库并从andoid更新输入的时间的脚本。 While running the same it is hosting but after saving text it giving error below 虽然运行相同它是托管但保存文本后它给出错误如下

       * Running on http://10.0.0.23:8080/ (Press CTRL+C to quit)
[2016-11-11 11:52:22,136] ERROR in app: Exception on /sendUserStringIntData [POST]
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1988, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1641, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1544, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1639, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python2.7/dist-packages/flask/app.py", line 1625, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
TypeError: getDataFromAndroid() takes exactly 1 argument (0 given)
10.0.0.27 - - [11/Nov/2016 11:52:22] "POST /sendUserStringIntData HTTP/1.1" 500 

How it should be resolved ? 应如何解决?

 * Running on http://10.0.0.23:8080/ (Press CTRL+C to quit)
Entire Data: ImmutableMultiDict([('UserName', u'mahaveer'), ('Age', u'0'), ('Password', u'null')])
mahaveer
{u'UserName': u'mahaveer', u'Age': u'24', u'_id': ObjectId('5825950e0f325f3a30ef7292'), u'Password': u'12345'}
{u'UserName': u'mahaveer', u'_id': ObjectId('582595530f325f3a563681c7')}
Entire Data:Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 763, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/home/cosmitude10/neon/measureMultithread/test.py", line 22, in getDataFromAndroid
    print "Entire Data:",request.form
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 343, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/usr/local/lib/python2.7/dist-packages/werkzeug/local.py", line 302, in _get_current_object
    return self.__local()
  File "/usr/local/lib/python2.7/dist-packages/flask/globals.py", line 37, in _lookup_req_object
    raise RuntimeError(_request_ctx_err_msg)
RuntimeError: Working outside of request context.

This typically means that you attempted to use functionality that needed
an active HTTP request.  Consult the documentation on testing for
information about how to avoid this problem.

 Total time for execution : 0.00076699256897 msec
10.0.0.27 - - [11/Nov/2016 15:24:27] "POST /sendUserStringIntData HTTP/1.1" 200 -

therading therading

threading.Thread(group=None, target=None, name=None, args=(), kwargs={})

args is the argument tuple for the target invocation. args是目标调用的参数元组。 Defaults to () 默认为()

t_args = (1)
assert type(t_args) is tuple, "except tuple, get {0}".format(type(t_args))
>>> AssertionError: except tuple, get <class 'int'>

t_args = (request,)
print type(t_args)
>>> <class 'tuple'>

t= threading.Thread(target=getDataFromAndroid, args=t_args)

tuple args =() / list args =[] 元组args =()/ list args = []
here you can also use partial from functools to call with args 在这里你也可以使用functools中的partial来调用args

class threading.Timer(interval, function, args=[], kwargs={})
threading.Timer(1, partial(your_method, your_arg_a, your_arg_b)).start()

there is a built-in module called timeit , 有一个名为timeit的内置模块,

This module provides a simple way to time small bits of Python code. 该模块提供了一种简单的方法来计算一小段Python代码。 It has both a Command-Line Interface as well as a callable one. 它既有命令行界面,也有可调用界面。 It avoids a number of common traps for measuring execution times 它避免了许多用于测量执行时间的常见陷阱

import timeit
....
start = timeit.default_timer()
t.start()
t.join()
print timit.default_timer - start

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM