标签:python multithreading nonblocking multiprocessing wxpython
Python 2.7.3 x64
wxPython 2.8 x64
已经阅读了很多关于python线程和多处理的内容,特别是Doug Hellmann撰写的一些文章,这些文章有很大的帮助.但是,我对一件事感到困惑……
我认为Python多处理模块或多或少是线程模块的直接替代品,除了args必须是可选择的,但我发现为了不阻止我的GUI,我必须首先创建一个新的线程使用threading.Thread然后使用multiprocessing.Process在该线程中进行多进程.这很有效,而且效果很好,但对我来说似乎有点笨拙.
如果我尝试在没有第一次线程的情况下直接进行多处理,那么我的GUI仍会阻塞,直到多处理作业完成.这是按设计工作的,还是我遗漏了多处理模块的基本原理?
如果需要示例,我可以提供它们.
谢谢,
-RMWChaos
要求一个例子……
假设onProcess()由GUI中的按钮触发,这会阻止GUI …
import time
import multiprocessing as mp
def myWorker(a, b):
time.sleep(0.1)
print '{} * {} = {}'.format(a, b, a*b)
def onProcess(event):
jobs = mp.cpu_count() * 2
a = 5
b = 10
for job in range(jobs):
mp.Process(target = myWorker, args = (a, b,)).start()
虽然这不……
import time
import multiprocessing as mp
import threading as th
def myWorker(a, b):
time.sleep(0.1)
print '{} * {} = {}'.format(a, b, a*b)
def onProcess(event):
a = 5
b = 10
th.Thread(target = myThread, args = [a, b,]).start()
def myThread(a, b):
jobs = mp.cpu_count() * 2
for job in range(jobs):
mp.Process(target = myWorker, args = (a, b,)).start()
解决方法:
多线程和多处理从根本上是不同的.
线程大部分用于i / o.当你创建一个新线程时,它包含在与你生成线程的程序相同的进程中.这意味着它与程序共享内存空间,但它们(程序和线程)不能并行运行(也可以查找GIL).
另一方面,多处理在OS级别上产生了一个新进程.这个新进程可以与预先存在的进程并行运行,但它不会与生成它的程序共享内存空间.当您想要加速的代码不是i / o相关但实际的处理器密集型计算时,这更有用.
对于一个gui,你大多想要对gui的不同部分使用线程,这样在gui的一个部分运行一些东西并不会锁定你的整个gui直到处理结束.
没有代码就很难分辨,但我相信你不应该特别需要在新线程中生成一个进程,而只是让该线程处理这个进程.但是,如果该线程需要处理密集的计算类型的处理而不是大量的i / o,那么您可能希望启动一个处理它的进程.
我相信你的大多数问题都在于误解多处理与多线程.
标签:python,multithreading,nonblocking,multiprocessing,wxpython 来源: https://codeday.me/bug/20191002/1845126.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。