2015-06-11 6 views
4

Я использую торрент python для запуска неблокированной функции, как мне передать параметры главной функции?как передать params в python tornado IOLoop run_sync (main) function

from __future__ import print_function 
from tornado import ioloop, gen 
import tornado_mysql 
import time 

@gen.coroutine 
def main(index): 
    conn = yield tornado_mysql.connect(host=db_host, port=3306, user=db_user, passwd=db_psw, db=db_db) 
    cur = conn.cursor() 
    sql = 'INSERT INTO `ctp_db`.`if1506` (`bid`) VALUES (%s)' 
    yield cur.execute(sql, (index)) 
    conn.commit() 
    cur.close() 
    conn.close() 

ioloop.IOLoop.current().run_sync(main) 

ответ

6

Метод IOLoop.run_sync() accept ссылается на функцию и пытается ее вызвать.

Итак, если вы хотите запустить неблокирующую функцию с указанными параметрами, вы должны обернуть ее другой функцией.

Вы можете сделать это с помощью дополнительной функции, оба приведенные ниже примеры являются правильными:

def run_with_args(func, *args): 
    return func(*args) 

ioloop.IOLoop.current().run_sync(run_with_args(main, index)) 

Чем короче путь с lambda:

ioloop.IOLoop.current().run_sync(lambda: main(index)) 
0

вы можете использовать functools.partial , например:

from tornado import gen 
from tornado.ioloop import IOLoop 

@gen.coroutine 
def func(): 
    print('this is the %(name)s'%{'name': func.__name__}) 
    yield gen.sleep(6.0) 
    print('%(num)d'%{'num': 10}) 


@gen.coroutine 
def foo(): 
    print('this is the %(name)s'%{'name': foo.__name__}) 
    yield gen.sleep(1.5) 
    print('%(num)d'%{'num': 5}) 


@gen.coroutine 
def call(): 
    yield gen.sleep(0) 
    print('this is the callback') 


@gen.coroutine 
def main(ioloop): 
    ioloop.call_later(5, call) 
    yield [func(), foo()] 


if __name__ == '__main__': 
    from functools import partial 
    ioloop = IOLoop.current() 
    main = partial(main, ioloop=ioloop) 
    ioloop.run_sync(main) 
Смежные вопросы