Вот более краткий ответ для людей, которые ищут быструю ссылку, а также некоторые примеры с использованием обещаний и асинхронных / ожидающих.
Начните с наивного подхода (который не работает) для функция, вызывающая асинхронный метод (в данном случае setTimeout
) и возвращает сообщение:
function getMessage() {
var outerScopeVar;
setTimeout(function() {
outerScopeVar = 'Hello asynchronous world!';
}, 0);
return outerScopeVar;
}
console.log(getMessage());
undefined
регистрируется в этом случае, поскольку getMessage
возвращается до вызова setTimeout
и обновления outerScopeVar
.
Двумя основными способами его решения являются обратные вызовы и обещания:
Обратные вызовы
Здесь изменение состоит в том, что getMessage
принимает параметр callback
, который будет вызываться для доставки результатов обратно к вызывающему коду после его доступности.
function getMessage(callback) {
setTimeout(function() {
callback('Hello asynchronous world!');
}, 0);
}
getMessage(function(message) {
console.log(message);
});
Обещания предоставляют альтернативу который является более гибким, чем обратные вызовы, потому что их можно комбинировать естественно для координации нескольких асинхронных операций. Стандартная реализация Promises / A + изначально представлена в node.js (0.12+) и многих текущих браузерах, но также реализована в таких библиотеках, как Bluebird и Q .
function getMessage() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('Hello asynchronous world!');
}, 0);
});
}
getMessage().then(function(message) {
console.log(message);
});
jQuery Отложенные
jQuery предоставляет функциональные возможности, аналогичные обещаниям с его отсрочкой.
function getMessage() {
var deferred = $.Deferred();
setTimeout(function() {
deferred.resolve('Hello asynchronous world!');
}, 0);
return deferred.promise();
}
getMessage().done(function(message) {
console.log(message);
});
async / await
Если ваша среда JavaScript включает поддержку async
и await
(например, Node.js 7.6+), то вы может использовать обещания синхронно в пределах функций async
:
function getMessage () {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('Hello asynchronous world!');
}, 0);
});
}
async function main() {
let message = await getMessage();
console.log(message);
}
main();
В ответ на этот вопрос есть красивые идиоматические функции,
. В вашем случае вы можете использовать эту функцию следующим образом:
def chunks(l, n):
""" Yield successive n-sized chunks from l.
"""
for i in xrange(0, len(l), n):
yield l.iloc[i:i+n]
def write_to_db(engine, frame, table_name, chunk_size):
for idx, chunk in enumerate(chunks(frame, chunk_size)):
if idx == 0:
if_exists_param = 'replace':
else:
if_exists_param = 'append'
chunk.to_sql(con=engine, name=table_name, if_exists=if_exists_param)
Только недостаток, что он не поддерживает нарезку второго индекса в функции iloc.
Обновление: эта функциональность была объединена в pandas master и будет выпущена в 0.15 (возможно, в конце сентября), благодаря @artemyk! См. https://github.com/pydata/pandas/pull/8062
Итак, начиная с 0,15, вы можете указать аргумент chunksize
и, например, просто выполните:
df.to_sql('table', engine, chunksize=20000)