什么是跨多处理rPc的好方法.过程?
我也愿意就以下架构设计建议:流程A*10,流程B*1.每个流程A必须检查流程B是否需要查询特定项目.
所以我正在考虑为所有As实现multiprocessing.Pipe()对象,然后让B监听它们中的每一个.但是,我意识到Multiprocessing.Pipe.recv是BLOCKING.所以我真的不知道如何做到这一点.(如果我使用一个循环来检查哪一个有通过另一端发送的东西,那么循环将被阻止).
有建议让我使用twisted,但是我不知道我应该如何在twisted中执行此操作:我是否应该从每个进程A创建一个defer对每个pipe.handler然后当recv()收到它继续的东西时并完成一定的例行程序?我知道个人扭曲与多处理不能很好地混合,但是我已经对扭曲进行了一些测试,这些测试是多处理实现的子进程,我想这次它是可行的.
有什么建议?
我在Python中创建了一个使用多处理的小脚本.我曾想过将它作为一个cron-job在Google App Engine上运行,但遗憾的是Google App Engine不支持多处理.任何人都可以帮助我将其转换为Google App Engine兼容代码(可能使用Google App Engine任务吗?)?
from multiprocessing import Pool
import MySQLdb
import urllib;
import urllib2;
def f(email_url):
url = "http://my-domain.com/cron.php"
values = { "email" : email_url[0], "url" : email_url[1] }
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
urllib2.urlopen(req)
if __name__ == '__main__':
p = Pool()
emails_urls = list()
conn = MySQLdb.connect(host = "XXX.XXX.XXX.XXX", user = "USERNAME",
passwd = "PASSWORD", db = "MY-DATABASE")
cursor = conn.cursor()
cursor.execute ("SELECT email, url FROM data")
rows = cursor.fetchall()
for row …Run Code Online (Sandbox Code Playgroud) 假设你想要5个线程同时处理数据.还假设您有89个要处理的任务.
你知道89/5 = 17,其余的是4.分离任务的最好方法是让4个(余数)线程每个处理18(17 + 1)个任务,然后有1个(#个线程 - 其余)线程处理17.
这将消除余数.只是为了验证:
Thread 1: Tasks 1-18 (18 tasks)
Thread 2: Tasks 19-36 (18 tasks)
Thread 3: Tasks 37-54 (18 tasks)
Thread 4: Tasks 55-72 (18 tasks)
Thread 5: Tasks 73-89 (17 tasks)
Run Code Online (Sandbox Code Playgroud)
完成了总共89项任务.
我需要一种方法来获得每个线程的开始和结束范围数学/可编程性; 以下内容应该打印出我上面列出的确切内容:
$NumTasks = 89
$NumThreads = 5
$Remainder = $NumTasks % $NumThreads
$DefaultNumTasksAssigned = floor($NumTasks / $NumThreads)
For $i = 1 To $NumThreads
if $i <= $Remainder Then
$NumTasksAssigned = $DefaultNumTasksAssigned + 1
else
$NumTasksAssigned = $DefaultNumTasksAssigned
endif
$Start …Run Code Online (Sandbox Code Playgroud) language-agnostic math programming-languages multiprocessing
假设我有这个示例代码:
x = foo1(something1)
y = foo2(something2)
z = max(x, y)
Run Code Online (Sandbox Code Playgroud)
我想通过使用线程来改善此代码的执行时间(希望它有帮助不是吗?).我想让事情尽可能简单,所以基本上我想做的是创建两个同时工作的线程,分别计算foo1和foo2.
我正在阅读有关线程的内容,但我发现它有点棘手,我不能因为做这么简单的事情而浪费太多时间.
我写了这个应该打开几个进程的代码,问题是它在linux上运行得很好但是当我在windows上执行它时它只创建一个进程!! 这可以用perl在windows上创建多进程吗?
$j = ARGV[0];
for($i=1; $i<=$j; $i++){
system("perl example.pl word.txt.$i &");
}
Run Code Online (Sandbox Code Playgroud) 我有一个与while循环相关的奇怪问题.我有一个函数,它在process(print_file())的父元素的末尾被调用,并且它不接受真正的条件继续.这是我简单的多进程代码,如下所示.
#include <stdio.h> /* basic I/O routines. */
#include <stdlib.h>
#include <unistd.h> /* define fork(), etc. */
#include <sys/types.h> /* define pid_t, etc. */
#include <sys/wait.h> /* define wait(), etc. */
#include <signal.h> /* define signal(), etc. */
#include <pthread.h>
#include <time.h>
#include <ctype.h>
void print_file(char* [], char* []);
void child_process(int,int);
void parent_process();
int counter=0;
int main(int argc, char* argv[]) {
counter = atoi(argv[1]);
int i,k;
pid_t child_pid;
int child_status;
char* array[counter];
srand ( time(NULL) ); …Run Code Online (Sandbox Code Playgroud) 在学校,我们上周开始进行多线程处理,现在我们已经进行了多处理,我有点迷失了,所以我将向你解释这个问题.对于练习,我们必须制作一个模拟10000个游戏的赌场游戏模拟器,以便我们知道赌场赢得游戏的频率.所以我编写了模拟器,我有5种方法来运行游戏:
static void game(Croupier croupier)
{
croupier.createNewCardDeck();
croupier.shuffleCards();
croupier.giveCardsToPlayers();
croupier.countPlayerPoints();
croupier.displayResults();
}
Run Code Online (Sandbox Code Playgroud)
如果我在10000次迭代的经典for循环中调用游戏,则运行正常,大约需要2秒,并且银行赢得50%的次数.
如果我使用Parallel.For,它会在shuffleCards上崩溃,因为(我认为)多个进程正在尝试同时编辑同一包卡.
我的第一个想法是将Mutex放在我的shuffleCards上,但是当使用并行编程来提高速度时,它会减慢模拟速度.所以我想把不同进程的数据分开(所以我不是10000次迭代,而是在4个进程上进行2500次,每个循环都有自己的副主持人,玩家,卡等...)
您认为解决此问题的最佳方法是什么?您是否有任何简单的教程解释如何处理使用相同数据的并行工作?你会选择哪种解决方案?谢谢
编辑:ShuffleCard方法
List<Card> randomList = new List<Card>();
Random r = new Random();
int randomIndex = 0;
while (_cards.Count > 0)
{
randomIndex = r.Next(0, _cards.Count); //Choose a random object in the list
randomList.Add(_cards[randomIndex]); //add it to the new, random list
_cards.RemoveAt(randomIndex); //remove to avoid duplicates
}
return randomList;
Run Code Online (Sandbox Code Playgroud)
所以是_cards是croupier的私有财产(调用this._cards = shuffleCards(),每个进程都有相同的卡列表
我试图将我的线程代码转换为多处理代码.但它给了我错误
Name Error: global name 'multiprocessing' is not defined
Run Code Online (Sandbox Code Playgroud)
安装了多处理,我将其导入
from multiprocessing import *
Run Code Online (Sandbox Code Playgroud) for i in xrange(1, 600851475141):
if 600851475141 % i == 0:
print i
Run Code Online (Sandbox Code Playgroud)
这花费了太多时间.有可能让它更快吗?
通常我一直在浏览这个问答网站,使用多线程和处理的答案告诉我使用这样的格式:
(target=foo, args=(bar, baz))
Run Code Online (Sandbox Code Playgroud)
我的问题是,什么target意思,有人可以解释它是如何使用的?
我无法在文档或其他地方找到好的解释.
multiprocessing ×10
python ×6
c ×1
c# ×1
gil ×1
math ×1
nameerror ×1
performance ×1
perl ×1
printf ×1
rpc ×1
simulator ×1
while-loop ×1