• XSS.stack #1 – первый литературный журнал от юзеров форума

При использовании aiofiles происходят баги, HELP

Peace

(L3) cache
Забанен
Регистрация
19.12.2022
Сообщения
255
Реакции
80
Пожалуйста, обратите внимание, что пользователь заблокирован
Всем привет, парсил сайты с прокси и при таком подходе. (всё асинхронно)
Python:
        for proxy in proxies['data']:
            if proxy['protocols'][0] == 'socks4':
                async with aiof.open('socks4.txt', 'a') as file:
                    await file.write(f"{proxy['ip']}:{proxy['port']}\n")
                    await file.flush()
                    await file.close()
            elif proxy['protocols'][0] == 'socks5':
                async with aiof.open('socks5.txt', 'a') as file:
                    await file.write(f"{proxy['ip']}:{proxy['port']}\n")
                    await file.flush()
                    await file.close()

Файл записывается очень криво, что делать в таком случае ?
50.47.75.216:5678
5
177.87.230.29:43573
95.182.78.8:5678
185.186.17.57:5678
103.127.23.10:5678
103.59.203.169:4145
27.72.122.228:51067
105.235.193.46:5678
119.63.135.206:5678
190.109.75.253:33633

50.96.204.251:18351

109.86.219.179:55489
197.253.30.1:10081
45.70.206.41:4145
49.51.97.76:443
75.182.38.113:5678
5.135.248.140:45952
37.131.164.48:59341
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Используй async with оператор для автоматического закрытия файла после записи в него поэтому нет необходимости вызывать await file.close()
а можешь показать как в коде это реализовать ?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
в доках написано когда мы выходим из блока async with, файл закрывается автоматически
сейчас попробую
 
Пожалуйста, обратите внимание, что пользователь заблокирован
в доках написано когда мы выходим из блока async with, файл закрывается автоматически
Python:
            if proxy['protocols'][0] == 'socks4':
                async with aiof.open('socks4.txt', 'a') as file:
                    await file.write(f"{proxy['ip']}:{proxy['port']}\n")
            elif proxy['protocols'][0] == 'socks5':
                async with aiof.open('socks5.txt', 'a') as file:
                    await file.write(f"{proxy['ip']}:{proxy['port']}\n")
оставил код в таком виде, но артефакты остались такими же
1.0.0.187:80
191.242.241.14:567845.7.210.200:4153
7
201.184.63.218:8080

178.22.221.201:4145
188.255.244.53:1080
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Python:
for proxy in proxies['data']:
    filename = proxy['protocols'][0] + '.txt'
    async with aiof.open(filename, 'a') as file:
        await file.write(f"{proxy['ip']}:{proxy['port']}\n")
Ты в потоках пишешь?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Python:
for proxy in proxies['data']:
    filename = proxy['protocols'][0] + '.txt'
    async with aiof.open(filename, 'a') as file:
        await file.write(f"{proxy['ip']}:{proxy['port']}\n")
Ты в потоках пишешь?
ты добавил только название файла, думаю это не поможет(
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Я пост оставил до твоего рефакторинга, и это был ответ на твой вопрос "а можешь в коде показать"
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Я пост оставил до твоего рефакторинга, очевидно не очень полезно уже.
а извини тогда ! Есть теории как можно решить это ?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ты используешь многопоточность в скрипте или только асинк?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
покажи код целиком, если можно. У меня сильное предчувствие, что тут не один ивентлуп
Обычно такое поведение характерно при состоянии гонки в потоках/процессах без блокировки записи.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
покажи код целиком, если можно. У меня сильное предчувствие, что тут не один ивентлуп
Обычно такое поведение характерно при состоянии гонки в потоках/процессах без блокировки записи.
Скрытый контент для пользователей: .
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Python:
        for proxy in proxies['data']:
            if proxy['protocols'][0] == 'socks4':
                await write_to_file('socks4.txt', f"{proxy['ip']}:{proxy['port']}\n")
                await asyncio.sleep(1)
если добавить слип секунда, то он идеально собирает, похоже проблема в потоках, но их нет
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Код:
 for proxy in proxies['data']:
            if proxy['protocols'][0] == 'socks4':
                write_to_file('socks4.txt', f"{proxy['ip']}:{proxy['port']}\n")


def write_to_file(filename, text):
    with open(filename, mode='a') as f:
        f.write(text)
Таким образом можно решить запись, но это получается как то не асинхронно
 
Пожалуйста, обратите внимание, что пользователь заблокирован
РЕШЕНИЕ!
на глобальном уровне определить мютекс
Код:
socks4lock = asyncio.Lock()
socks5lock = asyncio.Lock()
и потом используй его перед записью в файл:
Код:
for proxy in proxies['data']:
    if proxy['protocols'][0] == 'socks4':
        async with socks4lock:
            async with aiof.open('socks4.txt', 'a') as file:
                await file.write(f"{proxy['ip']}:{proxy['port']}\n")
                await file.flush()
                await file.close()
    elif proxy['protocols'][0] == 'socks5':
        async with socks5lock:
            async with aiof.open('socks5.txt', 'a') as file:
                await file.write(f"{proxy['ip']}:{proxy['port']}\n")
                await file.flush()
                await file.close()
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ну да, все верно, блокировка нужна была. В твоём случае (и обычно в большинстве других) достаточно одного объекта-блокировки. Он создается для синхронизации, поэтому должен быть глобальным
 
Последнее редактирование:
РЕШЕНИЕ!
на глобальном уровне определить мютекс
Код:
socks4lock = asyncio.Lock()
socks5lock = asyncio.Lock()
и потом используй его перед записью в файл:
Код:
for proxy in proxies['data']:
    if proxy['protocols'][0] == 'socks4':
        async with socks4lock:
            async with aiof.open('socks4.txt', 'a') as file:
                await file.write(f"{proxy['ip']}:{proxy['port']}\n")
                await file.flush()
                await file.close()
    elif proxy['protocols'][0] == 'socks5':
        async with socks5lock:
            async with aiof.open('socks5.txt', 'a') as file:
                await file.write(f"{proxy['ip']}:{proxy['port']}\n")
                await file.flush()
                await file.close()
Молодец что разобрался и закрыл тему, побольше бы таких юзеров на форме
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Молодец что разобрался и закрыл тему, побольше бы таких юзеров на форме
Благодарю !
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх