Python 程序仅使用multiprocessing.dummy运行
我正在将一个文件并行上传到一个Python 程序仅使用multiprocessing.dummy运行,python,multiprocessing,Python,Multiprocessing,我正在将一个文件并行上传到一个amazons3bukcet。我的代码完全符合我的需要。出于调试目的,我使用了multiprocessing.dummy导入池中的。现在程序运行了,我去掉了.dummy,只使用了多处理导入池中的。但是,在这一小改动之后,我的文件上载失败(跳到“其他”下的“文件上载已取消”)。我不确定是什么问题。下面发布的是一个代码。我删掉了大部分不相关的部分 def multipart_upload(bucketname, keyname, parallel_processes=5
amazons3bukcet
。我的代码完全符合我的需要。出于调试目的,我使用了multiprocessing.dummy导入池中的。现在程序运行了,我去掉了.dummy
,只使用了多处理导入池中的。但是,在这一小改动之后,我的文件上载失败(跳到“其他”下的“文件上载已取消”)。我不确定是什么问题。下面发布的是一个代码。我删掉了大部分不相关的部分
def multipart_upload(bucketname, keyname, parallel_processes=5):
"""
Parallel multipart upload.
"""
source_size = os.stat(keyname).st_size
mp = bucket.initiate_multipart_upload( keyname )
bytes_per_chunk = max(int(math.sqrt(5242880) * math.sqrt(source_size)),
5242880)
chunk_amount = int(math.ceil(source_size / float(bytes_per_chunk)))
def _upload(keyname, offset, part_num,bytes):
try:
print( 'Start uploading part #%d ...' % part_num )
with FileChunkIO(keyname, 'r', offset=offset,
bytes=bytes) as fp:
mp.upload_part_from_file( fp=fp, part_num=part_num )
except Exception as e:
print( 'FAILED uploading part #%d' % part_num )
raise e
else:
print( 'UPLOADED part #%d' % part_num )
if s3_has_uptodate_file(bucketname, keyname):
print ( 'File already present in bucket. Upload Cancelled')
mp.cancel_upload()
else:
print ( 'File Upload begininning with {0} cores'.format( parallel_processes ) )
pool = Pool(processes=parallel_processes)
for i in range( chunk_amount ):
offset = i * bytes_per_chunk
remaining_bytes = source_size - offset
bytes = min( [bytes_per_chunk, remaining_bytes] )
part_num = i + 1
start = timer()
pool.apply_async( _upload, [keyname, offset, part_num, bytes] )
pool.close()
pool.join()
end = timer()
if len( mp.get_all_parts() ) == chunk_amount:
mp.complete_upload()
print ( 'File Upload Complete\nTime taken {0} seconds'.format( end - start ) )
else:
print ( 'File Upload Cancelled' )
mp.cancel_upload()
multipart_upload(default_bucket, 'mybigfile.txt')
使用pool.apply
而不是pool.apply\u async
,则会出现错误。这可能是由于您的模块顶层没有定义上传的。@dano是的。它给了我一个cPickle.PicklingError:cannotpickle:attributelookup\uuu内置函数失败
错误。我该如何解决这个问题。你能在模块的顶层定义\u upload
,而不是在多部分上传中定义吗?我试试。我把它嵌套在我的多部分上传中
,因为当我把它放在外部时,我遇到了问题