Sejujurnya, saya bahkan tidak yakin harus memberi judul apa pertanyaan ini. Saya mencoba mengulang daftar besar URL, tetapi hanya memproses 20 URL (20 didasarkan pada berapa banyak proxy yang saya miliki) sekaligus. Tetapi saya juga harus terus mengulang daftar proxy, karena saya sedang memproses URL. Jadi, misalnya, itu akan dimulai dengan URL pertama dan proxy pertama, dan setelah menyentuh URL ke-21, itu akan menggunakan proxy pertama lagi. Inilah contoh buruk saya di bawah ini, jika ada yang bisa mengarahkan saya ke arah yang benar, itu akan sangat dihargai.

import pymysql.cursors
from multiprocessing import Pool
from fake_useragent import UserAgent

def worker(args):
    var_a, id, name, content, proxy, headers, connection = args
    print (var_a)
    print (id)
    print (name)
    print (content)
    print (proxy)
    print (headers)
    print (connection)
    print ('---------------------------')

if __name__ == '__main__':
    connection = pymysql.connect(
        host = 'host ',
        user = 'user',
        password = 'password',
        db = 'db',
        charset='utf8mb4',
        cursorclass=pymysql.cursors.DictCursor
    )

    ua = UserAgent()
    user_agent = ua.chrome
    headers = {'User-Agent' : user_agent}

    proxies = [
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx',
        'xxx.xxx.xxx.xxx:xxxxx'
    ]

    with connection.cursor() as cursor:
        sql = "SELECT id,name,content FROM table"
        cursor.execute(sql)
        urls = cursor.fetchall()

    var_a = 'static'

    data = ((var_a, url['id'], url['name'], url['content'], proxies[i % len(proxies)], headers, connection) for i, url in enumerate(urls))
    proc_num = 20
    p = Pool(processes=proc_num)
    results = p.imap(worker, data)
    p.close() 
    p.join()
1
antfuentes87 13 Agustus 2017, 09:13

2 jawaban

Jawaban Terbaik

Anda dapat menggunakan daftar untuk menyimpan proses baru. Saat Anda mencapai jumlah item tertentu, panggil join untuk setiap proses dalam daftar. Ini akan memberi Anda beberapa kontrol pada jumlah proses yang aktif.

if __name__ == '__main__':  
    proc_num = 20
    proc_list = []
    for i, url in enumerate(urls):
        proxy = proxies[i % len(proxies)] 
        p = Process(target=worker, args=(url, proxy))
        p.start()
        proc_list.append(p)
        if i % proc_num == 0 or i == len(urls)-1: 
            for proc in proc_list: 
                proc.join()


Jika Anda menginginkan jumlah proses aktif yang konstan, Anda dapat mencoba modul Pool. Cukup ubah definisi worker untuk menerima Tuple.

if __name__ == '__main__': 
    data = ((url, proxies[i % len(proxies)]) for i, url in enumerate(urls))
    proc_num = 20
    p = Pool(processes=proc_num)
    results = p.imap(worker, data)
    p.close() 
    p.join()

Hanya untuk memperjelas, fungsi worker harus menerima Tuple dan kemudian membongkarnya.

def worker(args):
    var_a, id, name, content, proxy, headers, connection = args
    print (var_a)
    ... etc ...
1
t.m.adam 18 Agustus 2017, 17:36

Coba kode di bawah ini:

for i in range(len(urls)):
    url = urls[i] # Current URL
    proxy = proxies[i % len(proxies)] # Current proxy
    # ...
0
Pravitha V 13 Agustus 2017, 07:08