Python线程池ThreadPoolExecutor实践
2019年5月15日 23:00 by wst
python高级
在使用ThreadPoolExecutor的过程中,一直想探索线程池会使用到多个核心吗?
带着这个疑问,首先做如下实验:
1. 从某个数文件读取数据,处理完后写到另一个文件。
2. 从某一个文件读取数据,处理完后,直接打印输出。
情况1
要考虑的问题:
1. 使用多线程写文件,会不会串行,比如都写I love you,会不会变成I love I you love you?
2. 怎么保证不串行?
3. 这个会使用多核心吗?
测试代码如下:
使用锁保证文件不会写串,结果写入文件则不能使用多核心(为什么?)。
import threading
import jsonlines
from concurrent.futures import ThreadPoolExecutor, as_completed
lock = threading.Lock()
def consume_user(line, writer):
""" 把结果写入文件 """
# 这里放置处理逻辑
time.sleep(10)
line2 = line
if lock.acquire(True):
writer.write(line2)
lock.release()
def write_file(**kwargs):
""" 多线程调用 """
t1 = time.time()
log.info("Start write data to file...")
source = kwargs.get("data_source", None)
print("source:", source)
fn = "files/%s_es.jsonl" % source
with jsonlines.open(fn) as fp:
with jsonlines.open('files/%s_result.jsonl' % source, mode='w') as writer:
with ThreadPoolExecutor(20) as executor:
future_to_read = [executor.submit(consume_user(line, writer)) for line in fp]
for future in as_completed(future_to_read):
print("future_result:", future.result())
log.info("Update data use time:{:.3f}".format(time.time() - t1))
if __name__ == "__main__"
t1 =time.time()
write_file(data_source="source1")
print("Done.{:.3f}".format(time.time()-t1))
情况2
处理完后,直接打印输出,代码如下:
经过观察此时每个核心被使用的量基本一致(为什么?)。
import threading
import jsonlines
from concurrent.futures import ThreadPoolExecutor, as_completed
lock = threading.Lock()
def consume_user(line, writer):
""" 把结果写入文件 """
# 这里放置处理逻辑
time.sleep(10)
line2 = line
print(line2)
def write_file(**kwargs):
""" 多线程调用 """
t1 = time.time()
log.info("Start write data to file...")
source = kwargs.get("data_source", None)
print("source:", source)
fn = "files/%s_es.jsonl" % source
with jsonlines.open(fn) as fp:
with jsonlines.open('files/%s_result.jsonl' % source, mode='w') as writer:
with ThreadPoolExecutor(20) as executor:
future_to_read = [executor.submit(consume_user(line, writer)) for line in fp]
for future in as_completed(future_to_read):
print("future_result:", future.result())
log.info("Update data use time:{:.3f}".format(time.time() - t1))
if __name__ == "__main__"
t1 =time.time()
write_file(data_source="source1")
print("Done.{:.3f}".format(time.time()-t1))
结论
1. 如果为了保证一致性,请使用锁机制;
2. 如果想使用多核心,则把结果打印输出,或存储到MySQL或ES
如果你有不同意见,欢迎在下方留言!!!
还有上面的为什么,谁帮我解解惑。
Ivangew
<a href="https://bpro1.top/">Українські привітання</a> - це не тільки прояв людської культури, але і важлива складова нашого життя. Це форма вираження поваги та прояву уваги до людей, які мають значення для нас. Як правило, привітання висловлюються з нагоди якоїсь події життя чи святкування, таких як дні народження, весілля, ювілеї, свята Нового року, Різдва та інших.
Привітання - це не просто слова, а вияв нашої поваги та уважності про людей, які мають значення в нашому житті. Вони здатні вразити та викликають внутрішні емоції, навіть через довгий час. Іноді навіть невелике привітання може мати велике значення для людини, яка відчуває себе одиноко, бо воно заряджає батарейки та мотивує.
Крім того, привітання може бути знаком, який свідчить про повагу до іншої людини та відображає бажання створити позитивну атмосферу. Важливість привітання полягає не лише в його формальності, але і в тому, що це може відкривати двері до нових знайомств та розвивати гарні стосунки з іншими людьми.
До слова, рекомендую вам чудовий ресурс з оригінальними вітаннями: <a href="https://bpro1.top/">https://bpro1.top/</a>.
Незалежно від того, чи це зустріч з новими друзями або просто знайомство з кимось на вулиці, привітання може бути класним першим кроком для побудови взаємовідносин. Це може також уникати напругу та допомагати створенню дружньої атмосфери для подальшої спілкування.
Більше того, привітання може бути важливим у професійному житті. Наприклад, вітання на початку робочого дня може створювати рівень мотивації та покращувати взаємини між колегами. Також, правильне привітання може мати вплив на перші враження професійного спілкування та поліпшувати думку про співрозмовника.
Нарешті, важливість привітання може бути особливо відчутною в культурі, де привітання є важливим елементом етикету і загального кодексу поведінки. Наприклад, в Японії, ввічливість вважається основною якістю людини, і правильне привітання та прощання є вимаганим у будь-якій ситуації. У цьому випадку, невідповідне привітання може бути сприйняте як прояв неуваги до культури та традицій країни.
У інших культурах, важливість привітання може бути неважливою, але в будь-якому випадку, воно залишається важливим засобом спілкування між людьми. Іноді привітання може бути вважатися знаком визнання до іншої людини, і може допомогти покращити взаємини між людьми.
Крім того, привітання може бути частиною ритуалів та традицій різних культур. Наприклад, у деяких культурах, важливе значення має рукостискання, а в інших - обійми або поцілунки. Ці ритуали допомагають підтримати взаємини між людьми та виражають повагу та шану до іншої людини.
Отже, можна стверджувати, що привітання - це значущий аспект комунікації між людьми. Це є проявом культури та ввічливості, що допомагає зберегти взаємовідносини та створити позитивну атмосферу. Крім того, привітання є виявом поваги до інших людей та їхніх традицій та звичаїв. Відсутність привітання може бути сприйнята як нешанобливість та неуважність до іншої людини.