我试图通过两个线程之间的信号/插槽发送一个结构,我的信号/插槽正确连接,我已经能够发送包含我的数据部分的QStrings但现在我需要发送整个东西,结构似乎最明智.但是,当我尝试信号没有发送/收到.问题似乎只是发送/接收结构,我尝试了很多方法之前和之后的处理.
我不能在这里或这里使用指针,因为我的数据生成得太快,内存被重写或释放(我已尝试使用指针并假设引用将同样受影响).
我已经将Q_DECLARE_METATYPE添加到我的结构中.我的结构现在只是一个小测试(稍后会放大)并且在它自己的头文件中.
#ifndef RETURNSTRUCT_H
#define RETURNSTRUCT_H
struct Datastruct
{
int markeridone;
};
Q_DECLARE_METATYPE(Datastruct);
#endif //RETURNSTRUCT_H
Run Code Online (Sandbox Code Playgroud)
为什么我的程序无法发送/接收结构?任何帮助深表感谢.
我使用的是Windows 7,MinGW 32位,Qt 5.7.0,Qt Creator 4.0.3
使用多次访问不同级别的dict 的最pythonic /有效方法是什么?<dict>.get('<key>')
(这些例子故意短,但想象更多的键和更长的原始字典)
一个例子:
而不是这个:
complete_data = {'name': 'bob',
'age':'22',
'items': [{'subitem':1,'another subitem':2}, 123, 456]}
required_data['name'] = complete_data['name']
required_data['another subitem'] = complete_data['items'][0]['another subitem']
Run Code Online (Sandbox Code Playgroud)
我们可以使用这样的东西:
complete_data = {'name': 'bob', 'age':'22', 'other stuff': 'some stuff'}
desired_keys = ['name','age']
for i in range(len(desired_keys)):
required_data[desired_keys[i]] = complete_data[desired_keys[i]]
Run Code Online (Sandbox Code Playgroud)
(但要complete_data['items'][0]['another subitem']在字典中找到更深层次的东西(?))
一些上下文:API发送的信息超出了我的需要.信息打包为dict,其中包含更多子序列和列表.我试图尽可能有效地提取信息,因为我必须重复这一百万次以上.我也希望尽可能高效地编写代码,因为我必须为多个API修改它.
所以我希望使用python多处理模块创建一个进程,我希望它是一个更大的脚本的一部分.(我也想要很多其他的东西,但现在我会满足于此)
我从多处理文档中复制了最基本的代码并稍微修改了一下
但是,每次调用p.join()时,语句之外的所有内容if __name__ == '__main__':都会重复.
这是我的代码:
from multiprocessing import Process
data = 'The Data'
print(data)
# worker function definition
def f(p_num):
print('Doing Process: {}'.format(p_num))
print('start of name == main ')
if __name__ == '__main__':
print('Creating process')
p = Process(target=f, args=(data,))
print('Process made')
p.start()
print('process started')
p.join()
print('process joined')
print('script finished')
Run Code Online (Sandbox Code Playgroud)
这是我的预期:
The Data
start of name == main
Creating process
Process made
process started
Doing Process: The Data …Run Code Online (Sandbox Code Playgroud) 我有几个进程,每个进程都需要一个大的 numpy 数组来完成任务,这只是被读取(线程正在搜索它以寻找适当的值)。
如果每个进程加载数据,我会收到内存错误。
因此,我试图通过使用管理器在进程之间共享相同的数组来最小化内存使用量。
但是我仍然收到内存错误。我可以在主进程中加载一次数组,但是当我尝试将其作为管理器命名空间的属性时,我收到了内存错误。我假设管理器就像指针一样,并允许单独的进程(通常只能访问自己的内存)也可以访问这个共享内存。但是错误提到了酸洗:
Traceback (most recent call last):
File <PATH>, line 63, in <module>
ns.pp = something
File "C:\Program Files (x86)\Python35-32\lib\multiprocessing\managers.py", line 1021, in __setattr__
return callmethod('__setattr__', (key, value))
File "C:\Program Files (x86)\Python35-32\lib\multiprocessing\managers.py", line 716, in _callmethod
conn.send((self._id, methodname, args, kwds))
File "C:\Program Files (x86)\Python35-32\lib\multiprocessing\connection.py", line 206, in send
self._send_bytes(ForkingPickler.dumps(obj))
File "C:\Program Files (x86)\Python35-32\lib\multiprocessing\reduction.py", line 50, in dumps
cls(buf, protocol).dump(obj)
MemoryError
Run Code Online (Sandbox Code Playgroud)
我假设 numpy 数组在分配给经理时实际上正在被复制,但我可能错了。
更令人恼火的是,我在一台具有 32GB 内存的机器上,看着内存使用情况,它只会在崩溃前稍微增加一点,最多可能增加 …
TL;DR - 消费者进程完成但不加入,不会引发错误并且脚本无限运行,在声明中陷入困境join?
我的目标是加快数据检索过程,但我不知道可能有多少“任务”(要检索的数据片段)。所以我做了一个修改版本的毒丸方法,让任务识别出何时不再检索信息,并触发毒丸语句if。
我已经发布了一个证明,这是我的毒丸方法的一个工作示例,以及一个完整的脚本,顾名思义,它是完整的脚本。(两者都应该能够按原样运行)
证明:
import multiprocessing
class Task:
def __init__(self, number):
self.number = number
def __call__(self):
"""Find officer and company data and combine and save it"""
try:
# 'gather some data!'
self.result = self.number*2
print(self.number)
# 'fake' finding no data
if self.result >= 8:
raise NameError
except NameError:
# become poison pill once latest is done
self.result = None
def output(self):
return self.result
class Consumer(multiprocessing.Process): …Run Code Online (Sandbox Code Playgroud)