У меня есть входной файл, который будет содержать длинный список URL.Предположим, это в mylines.txt
:
https://yahoo.com
https://google.com
https://facebook.com
https://twitter.com
Что мне нужно сделать, это:
1) Считать строку из входного файла mylines.txt
2)Выполнить функцию myFun
.Который будет выполнять некоторые задачи.И вывод продукции состоит из строки.В моем реальном коде это сложнее.Но что-то вроде этого в концепции.
3) Запишите вывод в файл results.txt
Так как у меня большой ввод.Мне нужно использовать многопоточность Python.Я посмотрел на этот хороший пост здесь .Но, к сожалению, он предполагает ввод в виде простого списка и не предполагает, что я хочу записать вывод функции в файл.
Мне нужно убедиться, что вывод каждого входа записан в одной строке (т.е. опасность, если многопотоковые записи пишут в одну и ту же строку, поэтому я получаю неверные данные).
Я пытался скучать.Но безуспешно.Раньше я не использовал многопоточность Python, но пришло время учиться, поскольку в моем случае это неизбежно.У меня очень длинный список, который не может закончиться за разумное время без многопоточности.Моя функция не будет выполнять эту простую задачу, но больше операций, которые не нужны для концепции.
Вот моя попытка.Пожалуйста, исправьте меня (в самом коде):
import threading
import requests
from multiprocessing.dummy import Pool as ThreadPool
import Queue
def myFunc(url):
response = requests.get(url, verify=False ,timeout=(2, 5))
results = open("myresults","a") # "a" to append results
results.write("url is:",url, ", response is:", response.url)
results.close()
worker_data = open("mylines.txt","r") # open my input file.
#load up a queue with your data, this will handle locking
q = Queue.Queue()
for url in worker_data:
q.put(url)
# make the Pool of workers
pool = ThreadPool(4)
results = pool.map(myFunc, q)
# close the pool and wait for the work to finish
pool.close()
pool.join()
В: Как исправить приведенный выше код (пожалуйста, будьте лаконичны и помогите мне в самом коде), чтобы прочитать строку из входного файла, выполнитьФункция, напишите результат, связанный с вводом, в строке, используя многопоточность Python для одновременного выполнения requests
, чтобы я мог закончить свой список в разумные сроки.
ОБНОВЛЕНИЕ:
На основании ответа код становится:
import threading
import requests
from multiprocessing.dummy import Pool as ThreadPool
import queue
from multiprocessing import Queue
def myFunc(url):
response = requests.get(url, verify=False ,timeout=(2, 5))
return "url is:" + url + ", response is:" + response.url
worker_data = open("mylines.txt","r") # open my input file.
#load up a queue with your data, this will handle locking
q = queue.Queue(4)
with open("mylines.txt","r") as f: # open my input file.
for url in f:
q.put(url)
# make the Pool of workers
pool = ThreadPool(4)
results = pool.map(myFunc, q)
with open("myresults","w") as f:
for line in results:
f.write(line + '\n')
mylines.txt содержит:
https://yahoo.com
https://www.google.com
https://facebook.com
https://twitter.com
Обратите внимание, что я впервые использовал:
import Queue
И: q = Queue.Queue (4)
Но получил сообщение об ошибке:
Traceback (most recent call last):
File "test3.py", line 4, in <module>
import Queue
ModuleNotFoundError: No module named 'Queue'
На основании какого-либо поиска я изменяюсь на:
import queue
И что касается строки: q = queue.Queue (4)
Я также добавил:
from multiprocessing import Queue
Но ничего не работает. Может ли какой-нибудь специалист по многопоточности Python помочь?