使用多处理创建数据并将其保存到 sql 数据库
Create data with multiprocessing and save it to sql database
我正在尝试通过在单个进程中收集所有数据并将其插入到 sqlite 数据库来保存使用多处理创建的数据:
from multiprocessing import Process, Queue, Manager
import time
import sqlite3
import queue
import os
def make_up_numbers(q):
for i in range(5):
time.sleep(1)
q.put([i]*3)
def save_numbers(q):
con = sqlite3.connect('test')
c = con.cursor()
query = 'INSERT INTO "test" VALUES (?, ?, ?)'
x = True
while x:
item = q.get(timeout = 3)
try:
c.execute(query, item)
except queue.Empty:
con.commit()
con.close()
x = False
if os.path.isfile('test'):
os.remove('test')
con = sqlite3.connect('test')
c = con.cursor()
c.execute('CREATE TABLE "test" ("col1" INTEGER, "col2" INTEGER, "col3" INTEGER)')
con.commit()
con.close()
q = Manager().Queue()
o = []
p = Process(target = save_numbers, args = (q, ), daemon = True)
p.start()
o.append(p)
for i in range(10):
p = Process(target = make_up_numbers, args = (q, ))
p.start()
o.append(p)
for p in o:
p.join()
然而,应该触发数据提交和循环结束的 queue.Empty
异常,而不是 returns 以下错误:
Process Process-179:
Traceback (most recent call last):
File "/home/vincent/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
self.run()
File "/home/vincent/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
self._target(*self._args, **self._kwargs)
File "<ipython-input-52-63a13637663b>", line 19, in show_number
item = q.get(timeout = 3)
File "<string>", line 2, in get
File "/home/vincent/anaconda3/lib/python3.7/multiprocessing/managers.py", line 834, in _callmethod
raise convert_to_error(kind, result)
_queue.Empty
谁能帮我解决这个问题?
将 q.get() 语句 放在 的 try: 块中 Queue.Empty。实际上,在执行到达 try 语句之前抛出异常。
我正在尝试通过在单个进程中收集所有数据并将其插入到 sqlite 数据库来保存使用多处理创建的数据:
from multiprocessing import Process, Queue, Manager
import time
import sqlite3
import queue
import os
def make_up_numbers(q):
for i in range(5):
time.sleep(1)
q.put([i]*3)
def save_numbers(q):
con = sqlite3.connect('test')
c = con.cursor()
query = 'INSERT INTO "test" VALUES (?, ?, ?)'
x = True
while x:
item = q.get(timeout = 3)
try:
c.execute(query, item)
except queue.Empty:
con.commit()
con.close()
x = False
if os.path.isfile('test'):
os.remove('test')
con = sqlite3.connect('test')
c = con.cursor()
c.execute('CREATE TABLE "test" ("col1" INTEGER, "col2" INTEGER, "col3" INTEGER)')
con.commit()
con.close()
q = Manager().Queue()
o = []
p = Process(target = save_numbers, args = (q, ), daemon = True)
p.start()
o.append(p)
for i in range(10):
p = Process(target = make_up_numbers, args = (q, ))
p.start()
o.append(p)
for p in o:
p.join()
然而,应该触发数据提交和循环结束的 queue.Empty
异常,而不是 returns 以下错误:
Process Process-179:
Traceback (most recent call last):
File "/home/vincent/anaconda3/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
self.run()
File "/home/vincent/anaconda3/lib/python3.7/multiprocessing/process.py", line 99, in run
self._target(*self._args, **self._kwargs)
File "<ipython-input-52-63a13637663b>", line 19, in show_number
item = q.get(timeout = 3)
File "<string>", line 2, in get
File "/home/vincent/anaconda3/lib/python3.7/multiprocessing/managers.py", line 834, in _callmethod
raise convert_to_error(kind, result)
_queue.Empty
谁能帮我解决这个问题?
将 q.get() 语句 放在 的 try: 块中 Queue.Empty。实际上,在执行到达 try 语句之前抛出异常。