如何用Python同时上传多个文件到云端?
我正在使用cloudfile模块来上传文件到Rackspace云存储,代码大概是这样的:
import cloudfiles
username = '---'
api_key = '---'
conn = cloudfiles.get_connection(username, api_key)
testcontainer = conn.create_container('test')
for f in get_filenames():
obj = testcontainer.create_object(f)
obj.load_from_filename(f)
我的问题是,我有很多小文件需要上传,这样上传的速度太慢了。
在文档里我发现有一个叫ConnectionPool的类,听说可以用来同时上传多个文件。
有人能教我怎么修改这段代码,让它一次上传多个文件吗?
1 个回答
8
ConnectionPool
类是为了多线程应用程序设计的,这种程序偶尔需要向 Rackspace 发送一些数据。
这样你就可以重复使用你的连接,而不需要为了 100 个线程而一直保持 100 个连接处于打开状态。
你只需要找一个可以支持多线程或多进程的上传工具。下面是一个使用 multiprocessing
库的例子:
import cloudfiles
import multiprocessing
USERNAME = '---'
API_KEY = '---'
def get_container():
conn = cloudfiles.get_connection(USERNAME, API_KEY)
testcontainer = conn.create_container('test')
return testcontainer
def uploader(filenames):
'''Worker process to upload the given files'''
container = get_container()
# Keep going till you reach STOP
for filename in iter(filenames.get, 'STOP'):
# Create the object and upload
obj = container.create_object(filename)
obj.load_from_filename(filename)
def main():
NUMBER_OF_PROCESSES = 16
# Add your filenames to this queue
filenames = multiprocessing.Queue()
# Start worker processes
for i in range(NUMBER_OF_PROCESSES):
multiprocessing.Process(target=uploader, args=(filenames,)).start()
# You can keep adding tasks until you add STOP
filenames.put('some filename')
# Stop all child processes
for i in range(NUMBER_OF_PROCESSES):
filenames.put('STOP')
if __name__ == '__main__':
multiprocessing.freeze_support()
main()