84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
假设:有个数据操作,处理100万条数据,每个数据的value+1。如简单代码假设
for x in range(1,100): x++
从数据库获取100条了,然后想多进程去执行x++?还是说多进程去数据库获取数据?谢谢了
业精于勤,荒于嬉;行成于思,毁于随。
有一个问题: 如果是数据库里面的数据, 为什么不执行sql,这比什么多进程要高效的多吧?如果非要你给出的二选一, 那么考虑一下:
1). 如果你要用多进程去数据库获取数据(就算你用了mysql连接池,可以不怎么考虑数据库连接的io消耗), 你每取一次数据,总要有一次查询吧, 完了以后,你还要把更新后的数据写入到数据库了, 又是一次数据库操作, 想想这个消耗有多大? 2). 数据库获取100万数据,然后想多进程去执行x++; 这种情况啊,只要计算机内存够(只有100万数据,基本是没问题的), 用python的进程池map一下,确实也是没什么问题
先将原始数据存入队列(queue)中,作为生产者后从队列中取数据,执行操作,作为消费者这时,可以在消费者开多线程(当然你锁处理得好的话,生产者也可以做多线程)
while tmp_queue.empty() is not True: x = tmp_queue.get() x += 1
在队列中,如果一直存在元素线程会持续进行操作。
其实Python中实现多进程的最佳方式是使用multiprocessing中的map
multiprocessing
map
例子(Python 3):
# f.py # 要对某个列表中每个元素都执行一次的function def f(x): return x + 1
# main.py from multiprocessing import pool from f import f # 创建进程池 p = pool.Pool(4) lst = range(100) # 使用多进程对整个列表进行计算 print(p.map(f, lst))
你可以直接把数据读取和数据+1两个函数再写到一个操作中啊,然后用多进程去操作,就上楼上说的一样用进程池进行操作。根据你的cpu核数,设置进程池的大小。由于多进程间不进行内存共享、也不能直接通信,你先用多进程从数据库中把所有数据读出来,然后再用多进程进行val+1也行的
有一个问题: 如果是数据库里面的数据, 为什么不执行sql,这比什么多进程要高效的多吧?
如果非要你给出的二选一, 那么考虑一下:
先将原始数据存入队列(queue)中,作为生产者
后从队列中取数据,执行操作,作为消费者
这时,可以在消费者开多线程(当然你锁处理得好的话,生产者也可以做多线程)
在队列中,如果一直存在元素线程会持续进行操作。
其实Python中实现多进程的最佳方式是使用
multiprocessing
中的map
例子(Python 3):
你可以直接把数据读取和数据+1两个函数再写到一个操作中啊,然后用多进程去操作,就上楼上说的一样用进程池进行操作。根据你的cpu核数,设置进程池的大小。由于多进程间不进行内存共享、也不能直接通信,你先用多进程从数据库中把所有数据读出来,然后再用多进程进行val+1也行的