import requests
import json
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
# Konfigurasi
API_URL = "https://a...content-available-to-author-only...1.com/index/user/do_register"
BATCH_SIZE = 1000
TOTAL_DATA = 5
MAX_WORKERS = 10 # Jumlah thread paralel
# Fungsi untuk generate dummy data
def generate_data( index) :
return {
"id" : index,
"name" : f"Item {index}" ,
"value" : index * 2 ,
}
# Fungsi untuk mengirim 1 batch data
def send_batch( batch_data) :
try :
response = requests.post ( API_URL, json= batch_data, timeout= 10 )
response.raise_for_status ( )
return { "success" : True , "count" : len ( batch_data) }
except requests.RequestException as e:
print ( f"Error sending batch: {e}" )
return { "success" : False , "error" : str ( e) }
# Fungsi utama untuk proses batching dan feeding
def main( ) :
start_time = time .time ( )
with ThreadPoolExecutor( max_workers= MAX_WORKERS) as executor:
futures = [ ]
for i in range ( 0 , TOTAL_DATA, BATCH_SIZE) :
batch = [ generate_data( j) for j in range ( i, min ( i + BATCH_SIZE, TOTAL_DATA) ) ]
futures.append ( executor.submit ( send_batch, batch) )
total_sent = 0
for future in as_completed( futures) :
result = future.result ( )
if result.get ( "success" ) :
total_sent += result[ "count" ]
end_time = time .time ( )
print ( f"Total sent: {total_sent} data" )
print ( f"Elapsed time: {end_time - start_time:.2f} seconds" )
if __name__ == "__main__" :
main( )
aW1wb3J0IHJlcXVlc3RzCmltcG9ydCBqc29uCmltcG9ydCB0aW1lCmZyb20gY29uY3VycmVudC5mdXR1cmVzIGltcG9ydCBUaHJlYWRQb29sRXhlY3V0b3IsIGFzX2NvbXBsZXRlZAoKIyBLb25maWd1cmFzaQpBUElfVVJMID0gImh0dHBzOi8vYS4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uMS5jb20vaW5kZXgvdXNlci9kb19yZWdpc3RlciIKQkFUQ0hfU0laRSA9IDEwMDAKVE9UQUxfREFUQSA9IDUKTUFYX1dPUktFUlMgPSAxMCAgIyBKdW1sYWggdGhyZWFkIHBhcmFsZWwKCiMgRnVuZ3NpIHVudHVrIGdlbmVyYXRlIGR1bW15IGRhdGEKZGVmIGdlbmVyYXRlX2RhdGEoaW5kZXgpOgogICAgcmV0dXJuIHsKICAgICAgICAiaWQiOiBpbmRleCwKICAgICAgICAibmFtZSI6IGYiSXRlbSB7aW5kZXh9IiwKICAgICAgICAidmFsdWUiOiBpbmRleCAqIDIsCiAgICB9CgojIEZ1bmdzaSB1bnR1ayBtZW5naXJpbSAxIGJhdGNoIGRhdGEKZGVmIHNlbmRfYmF0Y2goYmF0Y2hfZGF0YSk6CiAgICB0cnk6CiAgICAgICAgcmVzcG9uc2UgPSByZXF1ZXN0cy5wb3N0KEFQSV9VUkwsIGpzb249YmF0Y2hfZGF0YSwgdGltZW91dD0xMCkKICAgICAgICByZXNwb25zZS5yYWlzZV9mb3Jfc3RhdHVzKCkKICAgICAgICByZXR1cm4geyJzdWNjZXNzIjogVHJ1ZSwgImNvdW50IjogbGVuKGJhdGNoX2RhdGEpfQogICAgZXhjZXB0IHJlcXVlc3RzLlJlcXVlc3RFeGNlcHRpb24gYXMgZToKICAgICAgICBwcmludChmIkVycm9yIHNlbmRpbmcgYmF0Y2g6IHtlfSIpCiAgICAgICAgcmV0dXJuIHsic3VjY2VzcyI6IEZhbHNlLCAiZXJyb3IiOiBzdHIoZSl9CgojIEZ1bmdzaSB1dGFtYSB1bnR1ayBwcm9zZXMgYmF0Y2hpbmcgZGFuIGZlZWRpbmcKZGVmIG1haW4oKToKICAgIHN0YXJ0X3RpbWUgPSB0aW1lLnRpbWUoKQogICAgd2l0aCBUaHJlYWRQb29sRXhlY3V0b3IobWF4X3dvcmtlcnM9TUFYX1dPUktFUlMpIGFzIGV4ZWN1dG9yOgogICAgICAgIGZ1dHVyZXMgPSBbXQogICAgICAgIGZvciBpIGluIHJhbmdlKDAsIFRPVEFMX0RBVEEsIEJBVENIX1NJWkUpOgogICAgICAgICAgICBiYXRjaCA9IFtnZW5lcmF0ZV9kYXRhKGopIGZvciBqIGluIHJhbmdlKGksIG1pbihpICsgQkFUQ0hfU0laRSwgVE9UQUxfREFUQSkpXQogICAgICAgICAgICBmdXR1cmVzLmFwcGVuZChleGVjdXRvci5zdWJtaXQoc2VuZF9iYXRjaCwgYmF0Y2gpKQoKICAgICAgICB0b3RhbF9zZW50ID0gMAogICAgICAgIGZvciBmdXR1cmUgaW4gYXNfY29tcGxldGVkKGZ1dHVyZXMpOgogICAgICAgICAgICByZXN1bHQgPSBmdXR1cmUucmVzdWx0KCkKICAgICAgICAgICAgaWYgcmVzdWx0LmdldCgic3VjY2VzcyIpOgogICAgICAgICAgICAgICAgdG90YWxfc2VudCArPSByZXN1bHRbImNvdW50Il0KCiAgICBlbmRfdGltZSA9IHRpbWUudGltZSgpCiAgICBwcmludChmIlRvdGFsIHNlbnQ6IHt0b3RhbF9zZW50fSBkYXRhIikKICAgIHByaW50KGYiRWxhcHNlZCB0aW1lOiB7ZW5kX3RpbWUgLSBzdGFydF90aW1lOi4yZn0gc2Vjb25kcyIpCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgbWFpbigpCg==