title: Program runs only with multiprocessing.dummy
body: <p>I am uploading a file in parallel to an <code>amazon s3 bukcet</code>. I have the code working exactly for to my needs. For debugging purposes I was using <code>from multiprocessing.dummy import Pool</code>. Now that the program works, i got rid of the <code>.dummy</code> and only using <code>from multiprocessing import Pool</code>. However after this small change my file upload fails (jumps to 'File upload canceled' under else). I am not sure what seems to be the issue. Posted below is a the code. I have edited out most of the irrelevant parts.</p>
  
  <pre><code>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')
  </code></pre>